保存调整大小后的图像 Java

6
如何将调整大小后的图片保存到指定文件夹?
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    ImgChooser ic = new ImgChooser();
    ImageIcon icon = new ImageIcon(me,"id pic");
    Image img1 = icon.getImage();
    Image img2 = img1.getScaledInstance(105, 105, 0);
    icon.setImage(img2);
    jLabel1.setIcon(icon);
} 

这段代码是获取图片并将其调整大小。然后我希望将调整大小后的图像保存在另一个文件夹中。谢谢提前。


2
稍微离题一点,你可能想要阅读一下《Image.getScaledInstance()的危险》。 - MadProgrammer
3个回答

9

正如其他人已经提到的那样(+1),使用ImageIO.write(...),以下是一个示例:

public static void main(String[] args) {

    try {

        BufferedImage originalImage = ImageIO.read(new File("c:\\test.jpg"));//change path to where file is located
        int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();

        BufferedImage resizeImageJpg = resizeImage(originalImage, type, 100, 100);
        ImageIO.write(resizeImageJpg, "jpg", new File("c:\\images\\testresized.jpg")); //change path where you want it saved

    } catch (IOException e) {
        System.out.println(e.getMessage());
    }

}

private static BufferedImage resizeImage(BufferedImage originalImage, int type, int IMG_WIDTH, int IMG_HEIGHT) {
    BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type);
    Graphics2D g = resizedImage.createGraphics();
    g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null);
    g.dispose();

    return resizedImage;
}

Reference:


嗨David先生,如果我想要读取3种文件类型怎么办? - Weddy
1
哦,抱歉我在谈论我的文件选择器。问题问错了,抱歉XD。 - Weddy
这是一个有用的开始,但提供了较差的质量比例。我也使用了getScaledInstance和SCALE_SMOOTH,效果很好。 - paj28

4

试试这个...

使用ImageIO.write()方法...

static boolean ImageIO.write(RenderedImage im, String formatName, File output) throws IOException

例如:

try {

    // retrieve image

    BufferedImage bi = getMyImage();
    File outputfile = new File("saved.png");
    ImageIO.write(bi, "png", outputfile);

} catch (IOException e) {
    ...
}

3

首先将您的图像转换为BufferedImage,然后使用ImageIO保存图像:

BufferedImage image = new BufferedImage(img2.getWidth(null), img2.getHeight(null), BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2 = image.createGraphics();
g2.drawImage(img2, 0, 0, null);
g2.dispose();
ImageIO.write(image, formatName, outputFile);

格式名称是一个字符串,例如"jpg""png""gif",而outputFile是要保存图像的文件。

另请注意,如果您要保存不支持透明度的图像,则传递给BufferedImage构造函数的第三个参数应该是3字节图像,例如:BufferedImage.TYPE_3BYTE_BGR


1
我尝试了你的代码,并且也创建了一个输出文件,如下所示: File output = new File("samp.jpg"); 但是当运行时,出现了以下错误: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: sun.awt.image.ToolkitImage cannot be cast to java.awt.image.RenderedImage - Weddy
1
现在我遇到了这个错误 Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Width (-1) and height (-1) must be > 0 - Weddy
@eric 如果你遇到了这个错误,并且你按照示例操作,那么很可能是你要保存的图像无效(太小)或原始图像没有正确加载。 - MadProgrammer
1
你能再检查一下我的代码吗 XD ImageIcon icon = new ImageIcon(me,"id pic"); Image img1 = icon.getImage(); Image img2 = img1.getScaledInstance(105, 105, 0); BufferedImage image = new BufferedImage(img2.getWidth(null), img2.getHeight(null), BufferedImage.TYPE_4BYTE_ABGR); Graphics2D g2 = image.createGraphics(); g2.drawImage(img2, 0, 0, null); g2.dispose(); icon.setImage(img2); - Weddy
File output = new File("samp.jpg"); try { ImageIO.write(image, "jpg", output); } catch (IOException ex) { Logger.getLogger(ID_Form.class.getName()).log(Level.SEVERE, null, ex); } - Weddy
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接