裁剪图像后我得到了更大的尺寸

问题描述

我从未在 Java 中处理过图片,我是这方面的初学者。 我需要制作一个函数,根据图像中间的宽度和高度的一定比例裁剪图像。

enter image description here

通过 REST Api,我收到一个 multipartfile,我将其传递给图像裁剪功能。我使用 file.getBytes() 转发图像。

这里是我如何编写图像裁剪功能代码

public static byte[] cropImage(byte[] data) {
        ByteArrayInputStream bais = new ByteArrayInputStream(data);
        try {
            BufferedImage img = ImageIO.read(bais);
            int width = img.getWidth();
            int height = img.getHeight();
            float aspectRatio = (float) 275 / (float) 160;
            int destWidth;
            int destHeight;
            int startX;
            int startY;

            if(width/height > aspectRatio) {
                destHeight = height;
                destWidth = Math.round(aspectRatio * height);
                startX = Math.round(( width - destWidth ) / 2);
                startY = 0;
            } else if (width/height < aspectRatio) {
                destWidth = width;
                destHeight = Math.round(width / aspectRatio);
                startX = 0;
                startY = Math.round((height - destHeight) / 2);
            } else {
                destWidth = width;
                destHeight = height;
                startX = 0;
                startY = 0;
            }
            BufferedImage dst = new BufferedImage(destWidth,destHeight,BufferedImage.TYPE_INT_ARGB);
            dst.getGraphics().drawImage(img,destWidth,startX,startY,startX + destWidth,startY + destHeight,null);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(dst,"png",baos);
            return baos.toByteArray();
        } catch (IOException e) {
            throw new RuntimeException("IOException in scale");
        }
    }

但是当我裁剪图像时,结果是一个比接收到的图像大得多的图像。我需要有关如何解决此问题的帮助。

编辑:

根据this的回答,这部分代码的大小增加了:

ImageIO.read (bais)

有没有其他方法可以将图像从字节数组转换为缓冲图像但保持原始图像的大小?

解决方法

我不知道为什么,但问题出在部分 ImageIO.write(dst,"png",baos);

我尝试使用不同类型的图像(png、jpg、jpeg),但只有使用 png 才能减小我的图像大小。在我更改为 jpeg 的情况下,它缩小了所有图像的大小。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...