我怎样才能调整使用Java的图像?

我需要调整PNG,JPEG和GIF文件的大小。 我如何使用Java来做到这一点?

加载图像后,你可以尝试:

BufferedImage createResizedCopy(Image originalImage, int scaledWidth, int scaledHeight, boolean preserveAlpha) { System.out.println("resizing..."); 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; } 

FWIW我刚刚发布(Apache 2,托pipe在GitHub上)一个简单的用于Java的图像缩放库imgscalr (可在Maven中心获得 )。

图书馆实现了一些不同的图像缩放方法(包括克里斯·坎贝尔的渐进式方法,并有一些小的改进),如果你问它或者给你最快的或者最好看的(如果你请求)。

用法很简单,只是一堆静态方法。 最简单的用例是:

 BufferedImage scaledImage = Scalr.resize(myImage, 200); 

所有操作都会保持图像的原始比例,因此在这种情况下,您要求imgscalr在200像素宽和200像素高的范围内调整图像大小,默认情况下它会自动select最好看,最快的方法,因为它没有没有指定。

我从一开始就意识到这看起来像自我推销,但是我花费了我相当多的时间来search这个完全相同的主题,并不断得出不同的结果/方法/想法/build议,并决定坐下来写一个这个简单的实现可以解决80-85%的使用情况,在这种情况下,你有一个图像,可能需要一个缩略图 – 尽可能快或尽可能好看(对于那些已经尝试过,你会注意到做一个Graphics.drawImage甚至与BICUBIC插值一个足够小的图像,它仍然看起来像垃圾)。

Thumbnailator是一个开放源代码的Java图像调整库,stream畅的界面,在MIT许可下分发。

我编写这个库是因为在Java中制作高质量的缩略图可能会非常困难,并且由此产生的代码可能非常混乱。 使用Thumbnailator,可以使用简单stream畅的API来expression相当复杂的任务。

一个简单的例子

举一个简单的例子,拍摄一张图像并将其大小调整为100 x 100(保留原始图像的宽高比),并将其保存到文件中,可以用一个语句来实现:

 Thumbnails.of("path/to/image") .size(100, 100) .toFile("path/to/thumbnail"); 

一个先进的例子

Thumbnailatorstream畅的界面简化了复杂的大小调整任务。

假设我们想要做到以下几点:

  1. 把目录中的图像,
  2. resize为100 x 100,与原始图像的长宽比,
  3. 将它们全部保存为质量设置为0.85 JPEG,
  4. 文件名是从thumbnail.的原始文件中提取的thumbnail. 附加到开头

翻译成Thumbnailator,我们将能够执行以上与以下内容:

 Thumbnails.of(new File("path/to/directory").listFiles()) .size(100, 100) .outputFormat("JPEG") .outputQuality(0.85) .toFiles(Rename.PREFIX_DOT_THUMBNAIL); 

关于图像质量和速度的说明

这个库还使用Chet Haase和Romain Guy在Filthy Rich Clients中突出显示的渐进式双线性缩放方法,以便在确保可接受的运行时性能的同时生成高质量的缩略图。

你不需要一个库来做到这一点。 你可以用Java本身来做。

Chris Campbell在缩放图像方面有出色的和详细的介绍 – 请参阅这篇文章 。

Chet Haase和Romain Guy在他们的书“ 肮脏的富客户端 ”( Filthy Rich Clients)中也有详细的信息丰富的图片缩放。

Java高级映像现在是开源的,并提供您所需的操作。

如果你正在处理大的图像或想要一个好看的结果它不是在Java中的一个小事。 只需通过Graphics2D的重新调整操作即可创build高质量的缩略图。 您可以使用JAI来完成这项工作,但是需要做的工作比您想象的还要多,JAI有一个让我们的JVM出现OutOfMemory错误的恶习。

我build议使用ImageMagick作为一个外部的可执行文件,如果你能摆脱它。 它使用简单,它的工作权利,所以你不必。

如果在你的机器上安装imagemagick是一个选项,我推荐im4java 。 它在命令行界面上是一个非常薄的抽象层,但是它的工作非常好。

您可以尝试使用带有im4java的 GraphicsMagickimage processing系统作为Java的命令行界面。

GraphicsMagick有很多优点,但其中一个好处是:

  • 通用汽车用于处理世界上最大的照片网站(例如Flickr和Etsy)的数十亿文件。

Image Magick已被提及。 有一个名为JMagick的JNI前端项目。 这不是一个特别稳定的项目(Image Magick本身已经知道改变很多,甚至打破兼容性)。 也就是说,我们在生产环境中使用了JMagick和Image Magick的兼容版本,以高吞吐量,低延迟率执行扩展。 与之前我们尝试过的所有Javagraphics库相比,速度要快得多。

http://www.jmagick.org/index.html

Java Api不提供图像和降级图像质量的标准缩放function。

为此,我试图从JavaCVfunction使用cvResize,但似乎有些问题。

我发现了一个用于图像缩放的好库,只需在你的pom.xml中添加对“java-image-scaling”的依赖。

  <dependency> <groupId>com.mortennobel</groupId> <artifactId>java-image-scaling</artifactId> <version>0.8.6</version> </dependency> 

在mvn仓库中,你会得到最近的版本。

防爆。 在你的java程序中

ResampleOp resamOp = new ResampleOp(50,40);

 BufferedImage modifiedImage = resamOp.filter(originalBufferedImage, null); 

您可以使用Marvin(纯Javaimage processing框架)进行这种操作: http : //marvinproject.sourceforge.net

扩展插件: http : //marvinproject.sourceforge.net/en/plugins/scale.html

我开发了一个可用于处理GIFanimation的可用类(AnimatedGifEncoder,GifDecoder和LWZEncoder)的解决scheme。
你可以下载jgifcode jar并运行GifImageUtil类。 链接: http : //www.jgifcode.com

你可以使用下面的stream行产品: thumbnailator

如果你不想像 @Riyad Kalla那样导入imgScalr回答上面我testing的太好了,你可以从Peter Walser做这个回答 @Peter Walser在另一个问题上:

  /** * utility method to get an icon from the resources of this class * @param name the name of the icon * @return the icon, or null if the icon wasn't found. */ public Icon getIcon(String name) { Icon icon = null; URL url = null; ImageIcon imgicon = null; BufferedImage scaledImage = null; try { url = getClass().getResource(name); icon = new ImageIcon(url); if (icon == null) { System.out.println("Couldn't find " + url); } BufferedImage bi = new BufferedImage( icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_RGB); Graphics g = bi.createGraphics(); // paint the Icon to the BufferedImage. icon.paintIcon(null, g, 0,0); g.dispose(); bi = resizeImage(bi,30,30); scaledImage = bi;// or replace with this line Scalr.resize(bi, 30,30); imgicon = new ImageIcon(scaledImage); } catch (Exception e) { System.out.println("Couldn't find " + getClass().getName() + "/" + name); e.printStackTrace(); } return imgicon; } public static BufferedImage resizeImage (BufferedImage image, int areaWidth, int areaHeight) { float scaleX = (float) areaWidth / image.getWidth(); float scaleY = (float) areaHeight / image.getHeight(); float scale = Math.min(scaleX, scaleY); int w = Math.round(image.getWidth() * scale); int h = Math.round(image.getHeight() * scale); int type = image.getTransparency() == Transparency.OPAQUE ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB; boolean scaleDown = scale < 1; if (scaleDown) { // multi-pass bilinear div 2 int currentW = image.getWidth(); int currentH = image.getHeight(); BufferedImage resized = image; while (currentW > w || currentH > h) { currentW = Math.max(w, currentW / 2); currentH = Math.max(h, currentH / 2); BufferedImage temp = new BufferedImage(currentW, currentH, type); Graphics2D g2 = temp.createGraphics(); g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2.drawImage(resized, 0, 0, currentW, currentH, null); g2.dispose(); resized = temp; } return resized; } else { Object hint = scale > 2 ? RenderingHints.VALUE_INTERPOLATION_BICUBIC : RenderingHints.VALUE_INTERPOLATION_BILINEAR; BufferedImage resized = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = resized.createGraphics(); g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint); g2.drawImage(image, 0, 0, w, h, null); g2.dispose(); return resized; } } 

只需使用Burkhard的答案,但创buildgraphics后添加此行:

  g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 

您也可以将该值设置为BICUBIC,这将产生更好的质量图像,但操作更昂贵。 还有其他的渲染提示可以设置,但是我发现插值会产生最显着的效果。 请记住,如果你想放大很多,Java代码很可能会很慢。 我发现较大的图像开始产生滞后约300%的变焦,即使所有渲染提示都设置为优化速度而不是质量。