Java图像不可缩放

Java图像不可缩放,java,graphics,awt,bufferedimage,Java,Graphics,Awt,Bufferedimage,不确定我做错了什么,但保存的图像与原始~500px高的图像相同。我试图将图像设置为100px高,并保持aspectratio不变。然后保存较小的版本 BufferedImage original = ImageIO.read(inputStream); Integer width = original.getWidth(); float aspectratio = (float)original.getWidth()/(float)original.getHeight(); Integer ne

不确定我做错了什么,但保存的图像与原始~500px高的图像相同。我试图将图像设置为100px高,并保持aspectratio不变。然后保存较小的版本

BufferedImage original = ImageIO.read(inputStream);
Integer width = original.getWidth();
float aspectratio = (float)original.getWidth()/(float)original.getHeight();
Integer newwidth= Math.round(100*aspectratio);
BufferedImage scaledImage = new BufferedImage(newwidth,100,original.getType());
Graphics2D g = scaledImage.createGraphics();
g.drawImage(scaledImage,0,0,null);
g.dispose();
ImageIO.write(scaledImage, "PNG", result);

问题是
drawImage(Image,int,int,ImageObserver)
不会缩放图像。此外,您正在将图像绘制到自身。您需要使用
drawImage
的重载来缩放图像,如下所示:

// ...
Graphics2D g = scaledImage.createGraphics();
g.drawImage(original, 0, 0, scaledImage.getWidth(), scaledImage.getHeight(), 0, 0, original.getWidth(), original.getHeight(), null);
// ...

请参阅。

小示例的更多信息,具体取决于您的代码

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;


public class ImageScaler {


    public static void main(String[] args) {
        try {
            // Load the original image
            BufferedImage image = ImageIO.read(new File(("PATH_TO_YOUR_ORIGINAL_IMAGE")));
            float wh = (float)image.getWidth()/(float)image.getHeight();
            int aspect = Math.round(100*wh);
            // get a scaledInstance from the original image depending on your
            // calculated aspectRation
            Image scaledInstance = image.getScaledInstance(aspect, 100, Image.SCALE_SMOOTH);
            // convert the Image to BufferedImage
            BufferedImage bi = getScaledBufferedImage(scaledInstance);
            // Write it out
            File outputFile = new File("PATH_TO_SAVE_THE_SCALED_VERSION");
            ImageIO.write(bi, "png", outputFile);
        } catch (IOException ex) {
            Logger.getLogger(ImageScaler.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Converts a given Image instance to a BufferedImage
     * @param image
     * @return BufferedImage
     */
    private static BufferedImage getScaledBufferedImage(final Image image) {

        // check if image is instanceof BufferedImages
        if(image instanceof BufferedImage) {
            return (BufferedImage)image;
        }

        // create a new BufferedImage
        BufferedImage bi = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB);

        // get the Graphics Object from the BufferedImage
        Graphics g = bi.getGraphics();
        // draw the Image to the BufferedImage
        g.drawImage(image, 0, 0, null);
        // dispose the Graphics
        g.dispose();

        return bi;
    }

}

帕特里克

你可能会考虑看一些关于缩放图像的指针,而不是下沉者,但是我会“猜测”你的问题的答案可以很容易地被Google研究,搜索或读取JavaDoc……当你创建“代码”> SaleDimige<代码>时,用显式的高度<代码> 100 < /代码>生成的图像不可能只有100像素高。但是,您的代码中有一个明显的输入错误,
g.drawImage(scaleImage,0,0,null)
scaleImage
绘制到自身上。。。因此,你应该有一个完全透明或黑色的图像与正确的大小。除非你遗漏了什么仅供参考虽然OPs代码将处理此问题,但请注意,此版本的drawImage将拉伸图像以满足目标宽度/高度的要求,而不考虑原始图像的纵横比OP在其新图像SizeEyes中保留了纵横比,我说过,但让OP知道该方法的作用总是一个很好的提示;)OP可以简单地使用
Image#getScaledInstance
,将
-1
传递给宽度或高度参数,并对其进行整体处理,但这不是我的首选解决方案;)很好的例子,但是OP为什么要选择使用它呢?另外,您没有处理图形上下文,因为在某些系统上,图形上下文可能会阻止绘制任何内容;)@MadProgrammer:如果您想挑剔,应该从
finally
块调用
dispose()
,否则异常可能会阻止本机图形上下文的处理。;-)