001 package com.github.sarxos.webcam.util;
002
003 import java.awt.Graphics2D;
004 import java.awt.image.BufferedImage;
005 import java.awt.image.DataBuffer;
006 import java.awt.image.DataBufferByte;
007 import java.io.ByteArrayOutputStream;
008 import java.io.IOException;
009
010 import javax.imageio.ImageIO;
011
012 import com.github.sarxos.webcam.WebcamException;
013
014
015 public class ImageUtils {
016
017 /**
018 * Graphics Interchange Format.
019 */
020 public static final String FORMAT_GIF = "GIF";
021
022 /**
023 * Portable Network Graphic format.
024 */
025 public static final String FORMAT_PNG = "PNG";
026
027 /**
028 * Joint Photographic Experts Group format.
029 */
030 public static final String FORMAT_JPG = "JPG";
031
032 /**
033 * Bitmap image format.
034 */
035 public static final String FORMAT_BMP = "BMP";
036
037 /**
038 * Wireless Application Protocol Bitmap image format.
039 */
040 public static final String FORMAT_WBMP = "WBMP";
041
042 public static BufferedImage premultiple(BufferedImage src) {
043 BufferedImage pre = new BufferedImage(512, 512, BufferedImage.TYPE_INT_ARGB_PRE);
044 Graphics2D g2 = pre.createGraphics();
045 g2.drawImage(src, 0, 0, null);
046 g2.dispose();
047 pre.flush();
048 return pre;
049 }
050
051 public static BufferedImage unpremultiple(BufferedImage pre) {
052 BufferedImage src = new BufferedImage(512, 512, BufferedImage.TYPE_INT_ARGB);
053 Graphics2D g2 = pre.createGraphics();
054 g2.drawImage(src, 0, 0, null);
055 g2.dispose();
056 src.flush();
057 return src;
058 }
059
060 /**
061 * Convert {@link BufferedImage} to byte array.
062 *
063 * @param image the image to be converted
064 * @param format the output image format
065 * @return New array of bytes
066 */
067 public static byte[] toByteArray(BufferedImage image, String format) {
068
069 byte[] bytes = null;
070 ByteArrayOutputStream baos = new ByteArrayOutputStream();
071
072 try {
073 ImageIO.write(image, format, baos);
074 bytes = baos.toByteArray();
075 } catch (IOException e) {
076 throw new WebcamException(e);
077 } finally {
078 try {
079 baos.close();
080 } catch (IOException e) {
081 throw new WebcamException(e);
082 }
083 }
084
085 return bytes;
086 }
087
088 public static byte[] toRawByteArray(BufferedImage image) {
089
090 DataBuffer dbuf = image.getRaster().getDataBuffer();
091
092 if (dbuf instanceof DataBufferByte) {
093
094 return ((DataBufferByte) dbuf).getData();
095
096 } else {
097
098 int w = image.getWidth();
099 int h = image.getHeight();
100 int n = w * h;
101
102 byte[] bytes = new byte[n * 3];
103
104 int i, x, y, rgb;
105
106 for (i = 0; i < n; i++) {
107
108 x = i % w;
109 y = i / h;
110
111 rgb = image.getRGB(x, y);
112
113 bytes[i * 3 + 0] = (byte) ((rgb >> 16) & 0xff);
114 bytes[i * 3 + 1] = (byte) ((rgb >> 8) & 0xff);
115 bytes[i * 3 + 2] = (byte) (rgb & 0xff);
116 }
117
118 return bytes;
119 }
120 }
121 }