Java Swing Icon scaleDown(Icon icon, int maxWidth, int maxHeight)

Here you can find the source of scaleDown(Icon icon, int maxWidth, int maxHeight)

Description

scale Down

License

Apache License

Declaration

public static Icon scaleDown(Icon icon, int maxWidth, int maxHeight) 

Method Source Code

//package com.java2s;
//License from project: Apache License 

import javax.swing.*;

import java.awt.*;

import java.awt.image.BufferedImage;

public class Main {
    public static Icon scaleDown(Icon icon, int maxWidth, int maxHeight) {
        int w = icon.getIconWidth();
        int h = icon.getIconHeight();
        if (maxWidth > w && maxHeight > h) {
            return icon;
        }//from w w  w.j  ava2s.c  om

        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = (Graphics2D) image.getGraphics();
        icon.paintIcon(null, g2d, 0, 0);
        g2d.dispose();

        double hRatio = (double) maxWidth / (double) w;
        double vRatio = (double) maxHeight / (double) h;
        double ratio = Math.min(hRatio, vRatio);

        double targetWidth = ratio * w;
        double targetHeight = ratio * h;

        final BufferedImage scaledImage = getScaledInstance(image, (int) targetWidth, (int) targetHeight,
                RenderingHints.VALUE_INTERPOLATION_BILINEAR, true);

        return new Icon() {
            public void paintIcon(Component component, Graphics graphics, int x, int y) {
                graphics.drawImage(scaledImage, x, y, null);
            }

            public int getIconWidth() {
                return scaledImage.getWidth();
            }

            public int getIconHeight() {
                return scaledImage.getHeight();
            }
        };
    }

    /**
     * From http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html
     * 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}
     */
    private static 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 = 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;
    }
}

Related

  1. makeButtcon(Icon icon, Icon rollover, String tooltip, boolean is_toggle)
  2. mergeComponentAndIcon(JComponent component, Icon icon)
  3. mergeIcons(Icon i1, Icon i2, int offsetRechtsOben)
  4. reescala(Icon ic, int maxW, int maxH)
  5. resize(Icon icon, int width, int height)
  6. setComponentTabIcon(Component component, Icon icon)
  7. sizeToIcon(JComponent component, Icon icon)