如何从InputStream创建图像,调整大小并保存?

3

我有这样一段代码,其中我获取了一个InputStream并创建了一个图片:

Part file;
// more code
try {
        InputStream is = file.getInputStream();

        File f = new File("C:\\ImagenesAlmacen\\QR\\olaKeAse.jpg");

        OutputStream os = new FileOutputStream(f);
        byte[] buf = new byte[1024];
        int len;

        while ((len = is.read(buf)) > 0) {
            os.write(buf, 0, len);
        }

        os.close();
        is.close();

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

问题是我必须在从InputStream创建图像之前调整其大小。

那么如何调整从InputStream获取的图像大小并创建调整大小后的图像。我想将图像的最大边设置为180像素,然后按比例调整其他边。

示例:

图像 = 289px * 206px 调整大小后的图像 = 180px* 128px


你从未刷新OutputStream。至于你问题的另一部分,你可以在这里找到答案:https://dev59.com/inVC5IYBdhLWcg3wlyQo - blgt
@blgt 好的,请帮我处理刷新部分。我尝试了其他问题中提到的方法。现在我有一个 BufferedImage,如何将其保存为 jpg 图像,保存路径为 "C:\ImagenesAlmacen\QR\olaKeAse.jpg"? - Kaz Miller
通过执行与您上述所做的完全相同的操作,只需在os.close();之前添加 os.flush(); - blgt
1
@blgt Close意味着flush。这里没有问题。 - Durandal
@Durandal 嗯。你说得对;查找一下,flush在这种情况下实际上是一个空方法,write会自己进行本地调用。 - blgt
1个回答

9

我做了这个:

try {

        InputStream is = file.getInputStream();
        Image image = ImageIO.read(is);

        BufferedImage bi = this.createResizedCopy(image, 180, 180, true);
        ImageIO.write(bi, "jpg", new File("C:\\ImagenesAlmacen\\QR\\olaKeAse.jpg"));

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

BufferedImage createResizedCopy(Image originalImage, int scaledWidth, int scaledHeight, boolean preserveAlpha) {
    int imageType = preserveAlpha ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
    BufferedImage scaledBI = new BufferedImage(scaledWidth, scaledHeight, imageType);
    Graphics2D g = scaledBI.createGraphics();
    if (preserveAlpha) {
        g.setComposite(AlphaComposite.Src);
    }
    g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);
    g.dispose();
    return scaledBI;
}

我并没有使用其他代码。

希望能对某些人有所帮助!


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