Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 剪切图像后,我会得到更大的尺寸_Java_Bufferedimage_Javax.imageio_Multipartfile - Fatal编程技术网

Java 剪切图像后,我会得到更大的尺寸

Java 剪切图像后,我会得到更大的尺寸,java,bufferedimage,javax.imageio,multipartfile,Java,Bufferedimage,Javax.imageio,Multipartfile,我从未在java中使用过图片,我是这方面的初学者。 我需要做一个函数,它将根据图像中间宽度和高度的比率来裁剪图像。 通过RESTAPI,我收到一个多部分文件,并将其传递给图像裁剪函数。我使用file.getBytes()转发图像 下面是我如何编写图像裁剪函数的代码: public static byte[] cropImage(byte[] data) { ByteArrayInputStream bais = new ByteArrayInputStream(data);

我从未在java中使用过图片,我是这方面的初学者。 我需要做一个函数,它将根据图像中间宽度和高度的比率来裁剪图像。

通过RESTAPI,我收到一个多部分文件,并将其传递给图像裁剪函数。我使用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, 0, 0, destWidth, destHeight, 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");
        }
    }

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

我不知道为什么,但部分问题在于
ImageIO.write(dst,“png”,baos)


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

我想知道生成的图像是否有与原始图像不同的特征。例如,每种颜色的位数。一种方法可能是使用标准工具,进行相同的大小调整,然后比较结果图像和结果图像的特征。Gimp或imagemagick可能适用于此。宽度/高度是整数除法,请改用浮点或双变量,并添加到@DonBranson注释中,如果您使用默认(即中等)png压缩,不知道它是否以及对结果的影响有多大,但在这个旧答案中有一些有用的信息:首先,如果你清楚地表明你所说的是文件大小,而不是图像“大小”(即图像尺寸),这将有助于解决这个问题。其次,图像在内存中的表示与文件大小没有(直接)关系,因此链接的答案/代码没有那么重要。最后,您选择的存储图像的格式是PNG。如果您的输入是JPEG格式的“自然图像”(即照片),则应预期会增加大小,因为压缩此类图像的效率要低得多(但无损)。您应该指定输入格式和示例图像。PS:您可能想看看
BufferedImage.getSubimage(x,y,w,h)
ImageIO.read (bais)