001package com.github.sarxos.webcam.util;
002
003import java.awt.Graphics2D;
004import java.awt.image.BufferedImage;
005import java.awt.image.DataBuffer;
006import java.awt.image.DataBufferByte;
007import java.io.ByteArrayOutputStream;
008import java.io.IOException;
009
010import javax.imageio.ImageIO;
011
012import com.github.sarxos.webcam.WebcamException;
013
014
015public 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}