What causes poor image quality in Java JLabel icons?

后端 未结 3 1476
渐次进展
渐次进展 2021-01-17 22:06

Java JLabel icons are displaying with distorted pixels in JFrame. This is happening consistently with different png images (all 32x32). I am not sc

3条回答
  •  粉色の甜心
    2021-01-17 22:26

    Answer is from this link to generate high quality image : https://componenthouse.com/2008/02/08/high-quality-image-resize-with-java/

    The appropriate class from the link :

    public class ImageResize {
    
        public static void main(String[] args) {
            try {
                URL url = new URL("http://i.stack.imgur.com/L5DGx.png");
                BufferedImage image = ImageIO.read(url);
                ImageIO.write(resizeImage(image, 32, 32), "png", new File("D:/picture3.png"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private static BufferedImage resize(BufferedImage image, int width, int height) {
            int type = image.getType() == 0? BufferedImage.TYPE_INT_ARGB : image.getType();
            BufferedImage resizedImage = new BufferedImage(width, height, type);
            Graphics2D g = resizedImage.createGraphics();
            g.setComposite(AlphaComposite.Src);
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g.drawImage(image, 0, 0, width, height, null);
            g.dispose();
            return resizedImage;
        }
    
        private static BufferedImage resizeImage(BufferedImage image, int width, int height) {
            image = createCompatibleImage(image);
            image = resize(image, 100, 100);
            image = blurImage(image);
            return resize(image, width, height);
        }
    
        public static BufferedImage blurImage(BufferedImage image) {
            float ninth = 1.0f/9.0f;
            float[] blurKernel = {
                    ninth, ninth, ninth,
                    ninth, ninth, ninth,
                    ninth, ninth, ninth
            };
    
            Map map = new HashMap();
            map.put(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            map.put(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
            map.put(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
            RenderingHints hints = new RenderingHints(map);
            BufferedImageOp op = new ConvolveOp(new Kernel(3, 3, blurKernel), ConvolveOp.EDGE_NO_OP, hints);
            return op.filter(image, null);
        }
    
        private static BufferedImage createCompatibleImage(BufferedImage image) {
            GraphicsConfiguration gc = BufferedImageGraphicsConfig.getConfig(image);
            int w = image.getWidth();
            int h = image.getHeight();
            BufferedImage result = gc.createCompatibleImage(w, h, Transparency.TRANSLUCENT);
            Graphics2D g2 = result.createGraphics();
            g2.drawRenderedImage(image, null);
            g2.dispose();
            return result;
        }
    
    }
    

提交回复
热议问题