我有一个尺寸为800x800的图像,其大小为170 kb。我想将此图像调整为600x600。调整大小后,我希望缩小图像大小。我该怎么做?
使用一些支持通过Java进行图像处理的良好框架,例如IamageJ
Java中也有一些基本的支持,比如MemoryImageSource和PixelGrabber。
您可以使用100%Java、Apache2开源imgscalr库(一个静态类),并执行以下操作:
import org.imgscalr.Scalr.*; // static imports are awesome with the lib
... some class code ...
// This is a super-contrived method name, I just wanted to incorporate
// the details from your question accurately.
public static void resizeImageTo600x600(BufferedImage image) {
ImageIO.write(resize(image, 600), "JPG", new File("/path/to/file.jpg"));
}
注意:如果上面看起来很奇怪,静态导入允许我直接使用调整大小调用,而无需指定Scalr.resize(…)
此外,如果写出的缩放图像的质量看起来不够好(虽然它会很快写出),您可以对resize方法使用更多参数,如下所示:
public static void resizeImageTo600x600(BufferedImage image) {
ImageIO.write(resize(image, Method.ULTRA_QUALITY, 600), "JPG", new File("/path/to/file.jpg"));
}
..你甚至可以对结果应用BufferedImageOp来柔化它,以防缩小使图像看起来参差不齐:
public static void resizeImageTo600x600(BufferedImage image) {
ImageIO.write(resize(image, Method.ULTRA_QUALITY, 600, Scalr.OP_ANTIALIAS), "JPG", new File("/path/to/file.jpg"));
}
只需在Maven POM中添加以下dep条目(imgscalr位于Maven中央存储库中),即可开始使用库:
<dependency>
<groupId>org.imgscalr</groupId>
<artifactId>imgscalr-lib</artifactId>
<version>4.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
你不需要一个完整的图像处理库来简单地调整图像的大小。
推荐的方法是使用渐进式双线性缩放,如下所示(请像代码中一样随意使用此方法):
public BufferedImage scale(BufferedImage img, int targetWidth, int targetHeight) {
int type = (img.getTransparency() == Transparency.OPAQUE) ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
BufferedImage ret = img;
BufferedImage scratchImage = null;
Graphics2D g2 = null;
int w = img.getWidth();
int h = img.getHeight();
int prevW = w;
int prevH = h;
do {
if (w > targetWidth) {
w /= 2;
w = (w < targetWidth) ? targetWidth : w;
}
if (h > targetHeight) {
h /= 2;
h = (h < targetHeight) ? targetHeight : h;
}
if (scratchImage == null) {
scratchImage = new BufferedImage(w, h, type);
g2 = scratchImage.createGraphics();
}
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.drawImage(ret, 0, 0, w, h, 0, 0, prevW, prevH, null);
prevW = w;
prevH = h;
ret = scratchImage;
} while (w != targetWidth || h != targetHeight);
if (g2 != null) {
g2.dispose();
}
if (targetWidth != ret.getWidth() || targetHeight != ret.getHeight()) {
scratchImage = new BufferedImage(targetWidth, targetHeight, type);
g2 = scratchImage.createGraphics();
g2.drawImage(ret, 0, 0, null);
g2.dispose();
ret = scratchImage;
}
return ret;
}
在 Filthy Rich Client 修改和清理原始代码。
根据您的注释,您可以降低质量并对 JPEG 字节进行编码,如下所示:
<code>image</code>是BufferedImage。
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageWriter writer = (ImageWriter) ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(0.2f); // Change this, float between 0.0 and 1.0
writer.setOutput(ImageIO.createImageOutputStream(os));
writer.write(null, new IIOImage(image, null, null), param);
writer.dispose();
现在,由于os
是一个ByteArrayOutpuStream
,您可以对其进行Base64编码。
String base64 = Base64.encode(os.toByteArray());
问题内容: 我在这里使用Go调整大小包:https://github.com/nfnt/resize 我正在从S3中提取图像,如下所示: // this gives me data []byte 之后,我需要调整图像大小: // problem is that the original_image has to be of type image.Image 将图像上传到我的S3存储桶 // pro
我想减少一个480 X 480位图图像大小到30 X 30像素大小,但保持整个高度和宽度完整。(我不想缩放或使用高度/宽度属性!) 让我用更简单的方式--我试图将位图图像中的像素从480 X 480减少到30 X 30,高度和宽度保持不变,并且在将图像转换为30 X 30后,我预计会有一些失真。 我做了缩放,但它减少了宽度和高度,如果我再次增加宽度和高度,它只是恢复正常的像素。谢谢!
问题内容: 我一直在搜索google,只遇到过降低高度/宽度或通过CoreImage如何编辑UIImage外观的库。但是我还没有看到或找到一个库,这篇文章解释了如何减小图像大小,因此在上载时,它不是完整的图像大小。 到目前为止,我有这个: 并且正在发送12MB的照片。如何将其减小到1mb?谢谢! 问题答案: Xcode 9•Swift 4或更高版本 编辑/更新:对于iOS10 +,我们可以使用UI
问题内容: 我正在使用Grails开发网络相册,并且用于图像处理,正在使用grails-image-tools插件。如果上传的图像太大(例如:大于600 * 840),我需要一种功能来调整图像的大小。在这种情况下,我需要将此图像调整为600 * 840)。最有效的方法是什么?非常感谢。 问题答案:
问题内容: 我要在pdf文件中添加一个水印。水印是.bmp图像,并且是2290 x3026。尝试调整此图片的大小以适合页面时,我遇到很多麻烦,有人有什么建议吗? 这是方法的输出。 我会与你们共享pdf图片,但不幸的是我不能。 我应该尝试改用.jpg吗?我真的不知道iText如何处理不同的图像扩展名。 问题答案: 您可以使用另一种方法:“手动”调整图像大小(即通过图像处理软件),而不是通过iText
我有一个水印,我想放在我的pdf中。水印是一个。bmp图像,为2290 x 3026。我在调整图片大小以适应页面时遇到了很多问题,有人有什么建议吗? 下面是方法的输出。 我想和你们分享pdf的图片,但不幸的是我不能。 我是否应该尝试使用。改为jpg?我真的不知道iText处理不同图像扩展的效果如何。