001/*
002 * To change this template, choose Tools | Templates
003 * and open the template in the editor.
004 */
005
006package com.nativelibs4java.util;
007
008import java.awt.Image;
009import java.awt.image.BufferedImage;
010import java.awt.image.DataBuffer;
011import java.awt.image.DataBufferInt;
012import java.awt.image.PixelGrabber;
013import java.awt.image.WritableRaster;
014import java.nio.IntBuffer;
015
016/**
017 *
018 * @author ochafik
019 */
020public class ImageUtils {
021
022        public static int[] getImageIntPixels(Image image, boolean allowDeoptimizingDirectRead) {
023                return getImageIntPixels(image, 0, 0, image.getWidth(null), image.getHeight(null), allowDeoptimizingDirectRead);
024        }
025        public static int[] getImageIntPixels(Image image, int x, int y, int width, int height, boolean allowDeoptimizingDirectRead) {
026                if (image instanceof BufferedImage) {
027                        BufferedImage bim = (BufferedImage)image;
028                        WritableRaster raster = bim.getRaster();
029                        if (allowDeoptimizingDirectRead &&
030                                        raster.getParent() == null &&
031                                        raster.getDataBuffer().getNumBanks() == 1)
032                        {
033                                DataBuffer b = bim.getRaster().getDataBuffer();
034                                if (b instanceof DataBufferInt) {
035                                        int[] array = ((DataBufferInt)b).getData();
036                                        return array;
037                                }
038                        }
039                        return bim.getRGB(x, y, width, height, null, 0, width);
040                }
041                PixelGrabber grabber = new PixelGrabber(image, x, y, width, height, true);
042                try {
043                        grabber.grabPixels();
044                        return (int[])grabber.getPixels();
045                } catch (InterruptedException ex) {
046                        throw new RuntimeException("Pixel read operation was interrupted", ex);
047                }
048        }
049
050        public static void setImageIntPixels(BufferedImage image, boolean allowDeoptimizingDirectRead, IntBuffer pixels) {
051                setImageIntPixels(image, 0, 0, image.getWidth(null), image.getHeight(null), allowDeoptimizingDirectRead, pixels);
052        }
053        public static void setImageIntPixels(BufferedImage bim, int x, int y, int width, int height, boolean allowDeoptimizingDirectRead, IntBuffer pixels) {
054                WritableRaster raster = bim.getRaster();
055                if (allowDeoptimizingDirectRead &&
056                                raster.getParent() == null &&
057                                raster.getDataBuffer().getNumBanks() == 1)
058                {
059                        DataBuffer b = bim.getRaster().getDataBuffer();
060                        if (b instanceof DataBufferInt) {
061                                IntBuffer.wrap(((DataBufferInt)b).getData()).put(pixels);
062                                return;
063                        }
064                }
065
066                IntBuffer b = IntBuffer.allocate(width * height);
067                b.put(pixels);
068                b.rewind();
069                int[] array = b.array();
070                bim.setRGB(x, y, width, height, array, 0, width);
071        }
072}