mirror of
https://github.com/moparisthebest/davmail
synced 2024-12-04 14:52:24 -05:00
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)
|
||||
{
|
||||
Image result = biggest.getScaledInstance(32, 32, Image.SCALE_AREA_AVERAGING);
|
||||
BufferedImage result = getScaledInstance((BufferedImage)biggest, 32, 32, RenderingHints.VALUE_INTERPOLATION_BILINEAR, true);
|
||||
checkImageLoaded(result);
|
||||
return getQuantizedImage(result);
|
||||
}
|
||||
@ -439,6 +439,79 @@ public class ExeCompiler
|
||||
//
|
||||
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
|
||||
|
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
Block a user