A row of mostly cosmetic changes to imaging code.
This commit is contained in:
parent
f0ebbdb6a4
commit
cac4b7d891
3 changed files with 16 additions and 17 deletions
|
@ -17,13 +17,13 @@
|
|||
/*
|
||||
* The GIF encoding routines are based on the Acme libary
|
||||
*
|
||||
* The following addaptions and extensions were added by Juerg Lehni:
|
||||
* The following changes and extensions were added by Juerg Lehni:
|
||||
*
|
||||
* - encode now directly works on BufferedImage objects, the ImageEncoder
|
||||
* and ImageConsumer oriented frameworks has been removed.
|
||||
* - Only BufferedImages with IndexColorModel are taken, so no more
|
||||
* palette optimization with IntHashtable objects are necessary. If the
|
||||
* BufferedImage is in wrong format, helma.image.Quantizie is used to
|
||||
* BufferedImage is in wrong format, helma.image.ColorQuantizer is used to
|
||||
* convert it into a index based image.
|
||||
* - This version is much less space consuming as it only takes one sample
|
||||
* row of the rastered image at a time into memory during compression.
|
||||
|
|
|
@ -81,11 +81,11 @@ public class ImageFilterOp implements BufferedImageOp {
|
|||
}
|
||||
*/
|
||||
|
||||
// allways work in integer mode. this is more effective, and most
|
||||
// Always work in integer mode. this is more effective, and most
|
||||
// filters convert to integer internally anyhow
|
||||
ColorModel cm = new SimpleColorModel();
|
||||
|
||||
// create a BufferedImage of only 1 pixel height for fetching the rows of the image in the correct format (ARGB)
|
||||
// Create a BufferedImage of only 1 pixel height for fetching the rows of the image in the correct format (ARGB)
|
||||
// This speeds up things by more than factor 2, compared to the standard BufferedImage.getRGB solution,
|
||||
// which is supposed to be fast too. This is probably the case because drawing to BufferedImages uses
|
||||
// very optimized code which may even be hardware accelerated.
|
||||
|
@ -93,19 +93,18 @@ public class ImageFilterOp implements BufferedImageOp {
|
|||
Graphics2D g2d = row.createGraphics();
|
||||
int pixels[] = ((DataBufferInt)row.getRaster().getDataBuffer()).getData();
|
||||
|
||||
// make sure alpha values do not add up for each row:
|
||||
// Make sure alpha values do not add up for each row:
|
||||
g2d.setComposite(AlphaComposite.Src);
|
||||
// calculate scanline by scanline in order to safe memory.
|
||||
// Calculate scanline by scanline in order to safe memory.
|
||||
// It also seems to run faster like that
|
||||
for (int y = 0; y < height; y++) {
|
||||
g2d.drawImage(src, null, 0, -y);
|
||||
// now pixels contains the rgb values of the row y!
|
||||
// Now pixels contains the rgb values of the row y!
|
||||
// filter this row now:
|
||||
fltr.setPixels(0, y, width, 1, cm, pixels, 0, width);
|
||||
}
|
||||
g2d.dispose();
|
||||
|
||||
// the consumer now contains the filtered image, return it.
|
||||
// The consumer now contains the filtered image, return it.
|
||||
return consumer.getImage();
|
||||
}
|
||||
|
||||
|
@ -140,7 +139,7 @@ public class ImageFilterOp implements BufferedImageOp {
|
|||
}
|
||||
|
||||
public int getRGB(int rgb) {
|
||||
// this is the part that speeds up most.
|
||||
// This is the part that speeds up most.
|
||||
// java.awt.image.ColorModel would return the same value, but with
|
||||
// 4 function calls and a lot of shifts and ors per color!
|
||||
return rgb;
|
||||
|
|
|
@ -364,7 +364,7 @@ public class ImageWrapper {
|
|||
*/
|
||||
public void trim(int x, int y, boolean trimLeft, boolean trimTop, boolean trimRight, boolean trimBottom) {
|
||||
BufferedImage bi = this.getBufferedImage();
|
||||
int color = bi.getRGB(x, y), pixel;
|
||||
int color = bi.getRGB(x, y);
|
||||
int left = 0, top = 0, right = width - 1, bottom = height - 1;
|
||||
|
||||
// create a BufferedImage of only 1 pixel height for fetching the rows of the image in the correct format (ARGB)
|
||||
|
@ -447,7 +447,7 @@ public class ImageWrapper {
|
|||
}
|
||||
|
||||
/**
|
||||
* resizes the image using the Graphics2D approach
|
||||
* Resizes the image using the Graphics2D approach
|
||||
*/
|
||||
protected void resize(int w, int h, boolean smooth) {
|
||||
BufferedImage buffered = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
|
||||
|
@ -473,7 +473,7 @@ public class ImageWrapper {
|
|||
}
|
||||
|
||||
/**
|
||||
* Resize the image
|
||||
* Resizes the image
|
||||
*
|
||||
* @param w ...
|
||||
* @param h ...
|
||||
|
@ -483,19 +483,19 @@ public class ImageWrapper {
|
|||
(double) w / width,
|
||||
(double) h / height
|
||||
);
|
||||
// if the image is scaled, used the Graphcis2D method, otherwise use AWT:
|
||||
// If the image is scaled, used the Graphcis2D method, otherwise use AWT:
|
||||
if (factor > 1f) {
|
||||
// scale it with the Graphics2D approach for supperiour quality.
|
||||
// Scale it with the Graphics2D approach for superior quality.
|
||||
resize(w, h, true);
|
||||
} else {
|
||||
// Area averaging has the best results for shrinking of images:
|
||||
|
||||
// as getScaledInstance is asynchronous, the ImageWaiter is needed here too:
|
||||
// As getScaledInstance is asynchronous, the ImageWaiter is needed here too:
|
||||
// Image scaled = ImageWaiter.waitForImage(image.getScaledInstance(w, h, Image.SCALE_AREA_AVERAGING));
|
||||
// if (scaled == null)
|
||||
// throw new RuntimeException("Image cannot be resized.");
|
||||
|
||||
// this version is up to 4 times faster than getScaledInstance:
|
||||
// This version is up to 4 times faster than getScaledInstance:
|
||||
ImageFilterOp filter = new ImageFilterOp(new AreaAveragingScaleFilter(w, h));
|
||||
setImage(filter.filter(getBufferedImage(), null));
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue