在秋千中调整图像大小

时间:2011-11-27 06:33:15

标签: java swing graphics bufferedimage imageicon

我使用的代码片段用于将图像大小调整为窗帘大小(我希望将分辨率更改为200 dpi)。基本上我需要它的原因是因为我想显示用户选择的图像(有点大)然后如果用户批准我想在不同的地方显示相同的图像但使用较小的分辨率。不幸的是,如果我给它一个大图像,屏幕上就不会显示任何内容。另外,如果我改变

imageLabel.setIcon(newIcon); 

imageLabel.setIcon(icon); 

我得到要显示的图像,但没有正确的分辨率,这就是我知道我在这段代码中出现问题而不是其他地方的问题。

Image img = icon.getImage();

BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.createGraphics();
boolean myBool = g.drawImage(img, 0, 0, 100, 100, null);
System.out.println(myBool);
ImageIcon newIcon = new ImageIcon(bi);
imageLabel.setIcon(newIcon);
submitText.setText(currentImagePath);
imageThirdPanel.add(imageLabel);

4 个答案:

答案 0 :(得分:9)

您并不需要关心缩放图像的细节。 Image类已经有一个为此目的而设计的方法getScaledInstance(int width, int height, int hints)。 Java文档说:

  

创建此图像的缩放版本。返回一个新的Image对象   这将使图像处于指定的宽度和高度   默认。即使是,也可以异步加载新的Image对象   原始源图像已完全加载。如果是   宽度或高度是负数,然后替换值   保持原始图像尺寸的宽高比。

你可以像这样使用它:

// Scale Down the original image fast
Image scaledImage = imageToScale.getScaledInstance(newWidth, newHighth, Image.SCALE_FAST);
// Repaint this component
repaint();

检查this以获取完整示例。

答案 1 :(得分:6)

这是我的解决方案:

    private BufferedImage resizeImage(BufferedImage originalImage, int width, int height, int type) throws IOException {  
        BufferedImage resizedImage = new BufferedImage(width, height, type);  
        Graphics2D g = resizedImage.createGraphics();  
        g.drawImage(originalImage, 0, 0, width, height, null);  
        g.dispose();  
        return resizedImage;  
    }  

答案 2 :(得分:1)

尝试使用此CODE调整图像大小:

public static Image scaleImage(Image original, int newWidth, int newHeight) {
    //do nothing if new and old resolutions are same
    if (original.getWidth() == newWidth && original.getHeight() == newHeight) {
        return original;
    }

    int[] rawInput = new int[original.getHeight() * original.getWidth()];
    original.getRGB(rawInput, 0, original.getWidth(), 0, 0, original.getWidth(), original.getHeight());
    int[] rawOutput = new int[newWidth * newHeight];
    // YD compensates for the x loop by subtracting the width back out
    int YD = (original.getHeight() / newHeight) * original.getWidth() - original.getWidth();
    int YR = original.getHeight() % newHeight;
    int XD = original.getWidth() / newWidth;
    int XR = original.getWidth() % newWidth;
    int outOffset = 0;
    int inOffset = 0;
    for (int y = newHeight, YE = 0; y > 0; y--) {
        for (int x = newWidth, XE = 0; x > 0; x--) {
            rawOutput[outOffset++] = rawInput[inOffset];
            inOffset += XD;
            XE += XR;
            if (XE >= newWidth) {
                XE -= newWidth;
                inOffset++;
            }
        }
        inOffset += YD;
        YE += YR;
        if (YE >= newHeight) {
            YE -= newHeight;
            inOffset += original.getWidth();
        }
    }
    return Image.createRGBImage(rawOutput, newWidth, newHeight, false);
}

答案 3 :(得分:0)

这里给出了另一个例子:

2D-图形/ LoadImageandscaleit.htm“> HTTP://www.java2s.com/Tutorial/Java/0261_2D-Graphics/LoadImageandscaleit.htm

http://www.java2s.com/Code/JavaAPI/java.awt/ImagegetScaledInstanceintwidthintheightinthints.htm