Hello I have a QR code Image , and I want to resize it , when I try to resize it to a small image using this code , I always get a blury image , and the QR code is no longer valid when I scan it , but it works fine when I resize to a big sized images with the same code :
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.setRenderingHint(RenderingHints.KEY_DITHERING, hint);
g2.drawImage(ret, 0, 0, w, h, null);
g2.dispose();
ret = tmp;
} while (w != targetWidth || h != targetHeight);
return ret;
}
what is the problem , I don't exactly understand , please give me at least a hint , thank you
Please check this out Image.getScaledInstance() details can be found in this answer: How to improve the performance of g.drawImage() method for resizing images
Hope it helps
Based on @A4L's answer:
A more straigt forward version. Also his solution did only scale the canvas not the image itself.
to increase the quality you could add
I recommend Thumbnailnator because it gave me better quality images than the Java multi-step approach. The speed however might be better with your Graphics2D drawImage code.
See also Java - resize image without losing quality
In fact, the solution is even more simple. You don't have to create a new BufferedImage. You can apply the method mentioned by for3st directly to the original BufferedImage image ('image') and set the width and height you wish for it. Thus a single statement is only needed (included in stadard Java documentation):
I use affine transformation to achieve this task, here is my code, hope it helps