More utility methods: one for creating a new image with the same
configuration as another and one for computing a rectangle that bounds all non-transparent pixels in an image. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@1483 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: ImageUtil.java,v 1.15 2002/05/09 16:49:16 mdb Exp $
|
// $Id: ImageUtil.java,v 1.16 2002/06/19 08:24:22 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.media.util;
|
package com.threerings.media.util;
|
||||||
|
|
||||||
@@ -11,6 +11,7 @@ import java.awt.GraphicsConfiguration;
|
|||||||
import java.awt.GraphicsDevice;
|
import java.awt.GraphicsDevice;
|
||||||
import java.awt.GraphicsEnvironment;
|
import java.awt.GraphicsEnvironment;
|
||||||
import java.awt.Image;
|
import java.awt.Image;
|
||||||
|
import java.awt.Rectangle;
|
||||||
import java.awt.Shape;
|
import java.awt.Shape;
|
||||||
import java.awt.Transparency;
|
import java.awt.Transparency;
|
||||||
|
|
||||||
@@ -97,6 +98,18 @@ public class ImageUtil
|
|||||||
return _gc.createCompatibleImage(width, height, transparency);
|
return _gc.createCompatibleImage(width, height, transparency);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new buffered image with the same sample model and color
|
||||||
|
* model as the source image but with the new width and height.
|
||||||
|
*/
|
||||||
|
public static BufferedImage createCompatibleImage (
|
||||||
|
BufferedImage source, int width, int height)
|
||||||
|
{
|
||||||
|
WritableRaster raster =
|
||||||
|
source.getRaster().createCompatibleWritableRaster(width, height);
|
||||||
|
return new BufferedImage(source.getColorModel(), raster, false, null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to recolor images by shifting bands of color (in HSV color
|
* Used to recolor images by shifting bands of color (in HSV color
|
||||||
* space) to a new hue. The source images must be 8-bit color mapped
|
* space) to a new hue. The source images must be 8-bit color mapped
|
||||||
@@ -304,6 +317,63 @@ public class ImageUtil
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Computes the bounds of the smallest rectangle that contains all
|
||||||
|
* non-transparent pixels of this image. This isn't extremely
|
||||||
|
* efficient, so you shouldn't be doing this anywhere exciting.
|
||||||
|
*/
|
||||||
|
public static void computeTrimmedBounds (
|
||||||
|
BufferedImage image, Rectangle tbounds)
|
||||||
|
{
|
||||||
|
// this could be more efficient, but it's run as a batch process
|
||||||
|
// and doesn't really take that long anyway
|
||||||
|
int width = image.getWidth(), height = image.getHeight();
|
||||||
|
|
||||||
|
int firstrow = -1, lastrow = -1, minx = width, maxx = 0;
|
||||||
|
for (int yy = 0; yy < height; yy++) {
|
||||||
|
|
||||||
|
int firstidx = -1, lastidx = -1;
|
||||||
|
for (int xx = 0; xx < width; xx++) {
|
||||||
|
// if this pixel is transparent, do nothing
|
||||||
|
int argb = image.getRGB(xx, yy);
|
||||||
|
if ((argb >> 24) == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise, if we've not seen a non-transparent pixel,
|
||||||
|
// make a note that this is the first non-transparent
|
||||||
|
// pixel in the row
|
||||||
|
if (firstidx == -1) {
|
||||||
|
firstidx = xx;
|
||||||
|
}
|
||||||
|
// keep track of the last non-transparent pixel we saw
|
||||||
|
lastidx = xx;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we saw no pixels on this row, we can bail now
|
||||||
|
if (firstidx == -1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// update our min and maxx
|
||||||
|
minx = Math.min(firstidx, minx);
|
||||||
|
maxx = Math.max(lastidx, maxx);
|
||||||
|
|
||||||
|
// otherwise keep track of the first row on which we see
|
||||||
|
// pixels and the last row on which we see pixels
|
||||||
|
if (firstrow == -1) {
|
||||||
|
firstrow = yy;
|
||||||
|
}
|
||||||
|
lastrow = yy;
|
||||||
|
}
|
||||||
|
|
||||||
|
// fill in the dimensions
|
||||||
|
tbounds.x = minx;
|
||||||
|
tbounds.y = firstrow;
|
||||||
|
tbounds.width = maxx - minx + 1;
|
||||||
|
tbounds.height = lastrow - firstrow + 1;
|
||||||
|
}
|
||||||
|
|
||||||
/** The graphics configuration for the default screen device. */
|
/** The graphics configuration for the default screen device. */
|
||||||
protected static GraphicsConfiguration _gc;
|
protected static GraphicsConfiguration _gc;
|
||||||
static {
|
static {
|
||||||
|
|||||||
Reference in New Issue
Block a user