Jsmooth patch : improve icon scaling
git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@137 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
parent
915f70cba2
commit
bbdd1ae5d9
|
@ -430,7 +430,7 @@ public class ExeCompiler
|
||||||
|
|
||||||
if (biggest != null)
|
if (biggest != null)
|
||||||
{
|
{
|
||||||
Image result = biggest.getScaledInstance(32, 32, Image.SCALE_AREA_AVERAGING);
|
BufferedImage result = getScaledInstance((BufferedImage)biggest, 32, 32, RenderingHints.VALUE_INTERPOLATION_BILINEAR, true);
|
||||||
checkImageLoaded(result);
|
checkImageLoaded(result);
|
||||||
return getQuantizedImage(result);
|
return getQuantizedImage(result);
|
||||||
}
|
}
|
||||||
|
@ -439,6 +439,79 @@ public class ExeCompiler
|
||||||
//
|
//
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience method that returns a scaled instance of the
|
||||||
|
* provided {@code BufferedImage}.
|
||||||
|
*
|
||||||
|
* @param img the original image to be scaled
|
||||||
|
* @param targetWidth the desired width of the scaled instance,
|
||||||
|
* in pixels
|
||||||
|
* @param targetHeight the desired height of the scaled instance,
|
||||||
|
* in pixels
|
||||||
|
* @param hint one of the rendering hints that corresponds to
|
||||||
|
* {@code RenderingHints.KEY_INTERPOLATION} (e.g.
|
||||||
|
* {@code RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR},
|
||||||
|
* {@code RenderingHints.VALUE_INTERPOLATION_BILINEAR},
|
||||||
|
* {@code RenderingHints.VALUE_INTERPOLATION_BICUBIC})
|
||||||
|
* @param higherQuality if true, this method will use a multi-step
|
||||||
|
* scaling technique that provides higher quality than the usual
|
||||||
|
* one-step technique (only useful in downscaling cases, where
|
||||||
|
* {@code targetWidth} or {@code targetHeight} is
|
||||||
|
* smaller than the original dimensions, and generally only when
|
||||||
|
* the {@code BILINEAR} hint is specified)
|
||||||
|
* @return a scaled version of the original {@code BufferedImage}
|
||||||
|
*/
|
||||||
|
public BufferedImage getScaledInstance(BufferedImage img,
|
||||||
|
int targetWidth,
|
||||||
|
int targetHeight,
|
||||||
|
Object hint,
|
||||||
|
boolean higherQuality)
|
||||||
|
{
|
||||||
|
int type = (img.getTransparency() == Transparency.OPAQUE) ?
|
||||||
|
BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
|
||||||
|
BufferedImage ret = (BufferedImage)img;
|
||||||
|
int w, h;
|
||||||
|
if (higherQuality) {
|
||||||
|
// Use multi-step technique: start with original size, then
|
||||||
|
// scale down in multiple passes with drawImage()
|
||||||
|
// until the target size is reached
|
||||||
|
w = img.getWidth();
|
||||||
|
h = img.getHeight();
|
||||||
|
} else {
|
||||||
|
// Use one-step technique: scale directly from original
|
||||||
|
// size to target size with a single drawImage() call
|
||||||
|
w = targetWidth;
|
||||||
|
h = targetHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (higherQuality && w > targetWidth) {
|
||||||
|
w /= 2;
|
||||||
|
if (w < targetWidth) {
|
||||||
|
w = targetWidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (higherQuality && h > targetHeight) {
|
||||||
|
h /= 2;
|
||||||
|
if (h < targetHeight) {
|
||||||
|
h = targetHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferedImage tmp = new BufferedImage(w, h, type);
|
||||||
|
Graphics2D g2 = tmp.createGraphics();
|
||||||
|
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);
|
||||||
|
g2.drawImage(ret, 0, 0, w, h, null);
|
||||||
|
g2.dispose();
|
||||||
|
|
||||||
|
ret = tmp;
|
||||||
|
} while (w != targetWidth || h != targetHeight);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private ByteBuffer load(File in) throws Exception
|
private ByteBuffer load(File in) throws Exception
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 1.8 KiB |
Loading…
Reference in New Issue