001 /* 002 Copyright 2006 Jerry Huxtable 003 004 Licensed under the Apache License, Version 2.0 (the "License"); 005 you may not use this file except in compliance with the License. 006 You may obtain a copy of the License at 007 008 http://www.apache.org/licenses/LICENSE-2.0 009 010 Unless required by applicable law or agreed to in writing, software 011 distributed under the License is distributed on an "AS IS" BASIS, 012 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 See the License for the specific language governing permissions and 014 limitations under the License. 015 */ 016 017 package com.github.sarxos.webcam.util.jh; 018 019 import java.awt.Rectangle; 020 import java.awt.RenderingHints; 021 import java.awt.geom.Point2D; 022 import java.awt.geom.Rectangle2D; 023 import java.awt.image.BufferedImage; 024 import java.awt.image.BufferedImageOp; 025 import java.awt.image.ColorModel; 026 027 028 /** 029 * A convenience class which implements those methods of BufferedImageOp which 030 * are rarely changed. 031 */ 032 public abstract class JHFilter implements BufferedImageOp, Cloneable { 033 034 @Override 035 public BufferedImage createCompatibleDestImage(BufferedImage src, ColorModel dstCM) { 036 if (dstCM == null) 037 dstCM = src.getColorModel(); 038 return new BufferedImage(dstCM, dstCM.createCompatibleWritableRaster(src.getWidth(), src.getHeight()), dstCM.isAlphaPremultiplied(), null); 039 } 040 041 @Override 042 public Rectangle2D getBounds2D(BufferedImage src) { 043 return new Rectangle(0, 0, src.getWidth(), src.getHeight()); 044 } 045 046 @Override 047 public Point2D getPoint2D(Point2D srcPt, Point2D dstPt) { 048 if (dstPt == null) 049 dstPt = new Point2D.Double(); 050 dstPt.setLocation(srcPt.getX(), srcPt.getY()); 051 return dstPt; 052 } 053 054 @Override 055 public RenderingHints getRenderingHints() { 056 return null; 057 } 058 059 /** 060 * A convenience method for getting ARGB pixels from an image. This tries to 061 * avoid the performance penalty of BufferedImage.getRGB unmanaging the 062 * image. 063 * 064 * @param image a BufferedImage object 065 * @param x the left edge of the pixel block 066 * @param y the right edge of the pixel block 067 * @param width the width of the pixel arry 068 * @param height the height of the pixel arry 069 * @param pixels the array to hold the returned pixels. May be null. 070 * @return the pixels 071 * @see #setRGB 072 */ 073 public int[] getRGB(BufferedImage image, int x, int y, int width, int height, int[] pixels) { 074 int type = image.getType(); 075 if (type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB) 076 return (int[]) image.getRaster().getDataElements(x, y, width, height, pixels); 077 return image.getRGB(x, y, width, height, pixels, 0, width); 078 } 079 080 /** 081 * A convenience method for setting ARGB pixels in an image. This tries to 082 * avoid the performance penalty of BufferedImage.setRGB unmanaging the 083 * image. 084 * 085 * @param image a BufferedImage object 086 * @param x the left edge of the pixel block 087 * @param y the right edge of the pixel block 088 * @param width the width of the pixel arry 089 * @param height the height of the pixel arry 090 * @param pixels the array of pixels to set 091 * @see #getRGB 092 */ 093 public void setRGB(BufferedImage image, int x, int y, int width, int height, int[] pixels) { 094 int type = image.getType(); 095 if (type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB) 096 image.getRaster().setDataElements(x, y, width, height, pixels); 097 else 098 image.setRGB(x, y, width, height, pixels, 0, width); 099 } 100 101 @Override 102 public Object clone() { 103 try { 104 return super.clone(); 105 } catch (CloneNotSupportedException e) { 106 return null; 107 } 108 } 109 }