[3651] in java-interest

home help back first fref pref prev next nref lref last post

Re: Colors of an Image

daemon@ATHENA.MIT.EDU (Jim Graham)
Tue Nov 21 12:36:04 1995

Date: Fri, 17 Nov 1995 17:46:09 -0800
From: flar@bendenweyr.Eng.Sun.COM (Jim Graham)
To: java-interest@java.Eng.Sun.COM, aleph1@dfw.net

----------
X-Sun-Data-Type: text
X-Sun-Data-Description: text
X-Sun-Data-Name: text
X-Sun-Charset: us-ascii
X-Sun-Content-Lines: 17


> 	How can I find the red, green, and red values for a pixel in an
> Image?

Get its ImageProducer using Image.getSource() and then register yourself
as an ImageConsumer using starProduction() and save the pixel values as
they are delivered in the setPixels() interface method.  Attached is a
utility class to do this:

	int[] buffer = new int[w*h];
	PixelGrabber pg = new PixelGrabber(image, x, y, w, h,
					   buffer, 0, w);
	pg.grabPixels();
	// Now buffer[j * w + i] will contain the ARGB values
	// for pixel (x+i, y+j) in the image.

				...jim
----------
X-Sun-Data-Type: default
X-Sun-Data-Description: default
X-Sun-Data-Name: PixelGrabber.java
X-Sun-Charset: us-ascii
X-Sun-Content-Lines: 176

import java.util.Hashtable;
import java.awt.image.ImageProducer;
import java.awt.image.ImageConsumer;
import java.awt.image.ColorModel;
import java.awt.Image;

public class PixelGrabber implements ImageConsumer {
    ImageProducer producer;

    int dstX;
    int dstY;
    int dstW;
    int dstH;

    int[] pixelbuf;
    int dstOff;
    int dstScan;

    private boolean grabbing;
    private boolean grabbed;

    public PixelGrabber(Image img, int x, int y, int w, int h,
			int[] pix, int off, int scansize) {
	this(img.getSource(), x, y, w, h, pix, off, scansize);
    }

    public PixelGrabber(ImageProducer ip, int x, int y, int w, int h,
			int[] pix, int off, int scansize) {
	producer = ip;
	dstX = x;
	dstY = y;
	dstW = w;
	dstH = h;
	dstOff = off;
	dstScan = scansize;
	pixelbuf = pix;
    }

    public void grabPixels() throws InterruptedException {
	grabPixels(0);
    }

    public synchronized boolean grabPixels(long ms)
	throws InterruptedException
    {
	long end = ms + System.currentTimeMillis();
	if (!grabbing) {
	    producer.startProduction(this);
	    grabbing = true;
	}
	while (!grabbed) {
	    long timeout;
	    if (ms == 0) {
		timeout = 0;
	    } else {
		timeout = end - System.currentTimeMillis();
		if (timeout <= 0) {
		    break;
		}
	    }
	    wait(timeout);
	}
	return grabbed;
    }

    public void setDimensions(int width, int height) {
	return;
    }

    public void setHints(int hints) {
	return;
    }

    public void setProperties(Hashtable props) {
	return;
    }

    public void setColorModel(ColorModel model) {
	return;
    }

    public void setPixels(int srcX, int srcY, int srcW, int srcH,
			  ColorModel model,
			  byte pixels[], int srcOff, int srcScan) {
	if (srcY < dstY) {
	    int diff = dstY - srcY;
	    if (diff >= srcH) {
		return;
	    }
	    srcOff += srcScan * diff;
	    srcY += diff;
	    srcH -= diff;
	}
	if (srcY + srcH > dstY + dstH) {
	    srcH = (dstY + dstH) - srcY;
	    if (srcH <= 0) {
		return;
	    }
	}
	if (srcX < dstX) {
	    int diff = dstX - srcX;
	    if (diff >= srcW) {
		return;
	    }
	    srcOff += diff;
	    srcX += diff;
	    srcW -= diff;
	}
	if (srcX + srcW > dstX + dstW) {
	    srcW = (dstX + dstW) - srcX;
	    if (srcW <= 0) {
		return;
	    }
	}
	int dstPtr = dstOff + (srcY - dstY) * dstScan + (srcX - dstX);
	int dstRem = dstScan - dstW;
	int srcRem = srcScan - srcW;
	for (int h = srcH; h > 0; h--) {
	    for (int w = srcW; w > 0; w--) {
		pixelbuf[dstPtr++] = model.getRGB(pixels[srcOff++] & 0xff);
	    }
	    srcOff += srcRem;
	    dstPtr += dstRem;
	}
    }

    public void setPixels(int srcX, int srcY, int srcW, int srcH,
			  ColorModel model,
			  int pixels[], int srcOff, int srcScan) {
	if (srcY < dstY) {
	    int diff = dstY - srcY;
	    if (diff >= srcH) {
		return;
	    }
	    srcOff += srcScan * diff;
	    srcY += diff;
	    srcH -= diff;
	}
	if (srcY + srcH > dstY + dstH) {
	    srcH = (dstY + dstH) - srcY;
	    if (srcH <= 0) {
		return;
	    }
	}
	if (srcX < dstX) {
	    int diff = dstX - srcX;
	    if (diff >= srcW) {
		return;
	    }
	    srcOff += diff;
	    srcX += diff;
	    srcW -= diff;
	}
	if (srcX + srcW > dstX + dstW) {
	    srcW = (dstX + dstW) - srcX;
	    if (srcW <= 0) {
		return;
	    }
	}
	int dstPtr = dstOff + (srcY - dstY) * dstScan + (srcX - dstX);
	int dstRem = dstScan - dstW;
	int srcRem = srcScan - srcW;
	for (int h = srcH; h > 0; h--) {
	    for (int w = srcW; w > 0; w--) {
		pixelbuf[dstPtr++] = model.getRGB(pixels[srcOff++]);
	    }
	    srcOff += srcRem;
	    dstPtr += dstRem;
	}
    }

    public synchronized void imageComplete(int flags) {
	grabbed = true;
	notifyAll();
    }
}
-
This message was sent to the java-interest mailing list
Info: send 'help' to java-interest-request@java.sun.com

home help back first fref pref prev next nref lref last post