Java 剪切图像后,我会得到更大的尺寸
我从未在java中使用过图片,我是这方面的初学者。 我需要做一个函数,它将根据图像中间宽度和高度的比率来裁剪图像。 通过RESTAPI,我收到一个多部分文件,并将其传递给图像裁剪函数。我使用file.getBytes()转发图像 下面是我如何编写图像裁剪函数的代码: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);
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)