Java 调整图像文件大小

Java 调整图像文件大小,java,image,Java,Image,我有很多用数码相机拍摄的图像,分辨率高达3000*4000,占用了大量的硬盘空间,我用Photoshop打开每张图像并重新调整大小,使其具有较小的分辨率,但这需要大量的时间和精力 我认为我可以编写一个简单的程序,打开图像文件夹,读取每个文件,得到它的宽度和高度,如果它很高,则更改它并用小的图像覆盖它。这里我在Java EE项目中使用的一些代码应该在正常应用程序中工作,以便: int rw = the width I needed; BufferedImage image = ImageIO.r

我有很多用数码相机拍摄的图像,分辨率高达3000*4000,占用了大量的硬盘空间,我用Photoshop打开每张图像并重新调整大小,使其具有较小的分辨率,但这需要大量的时间和精力


我认为我可以编写一个简单的程序,打开图像文件夹,读取每个文件,得到它的宽度和高度,如果它很高,则更改它并用小的图像覆盖它。

这里我在Java EE项目中使用的一些代码应该在正常应用程序中工作,以便:

int rw = the width I needed;

BufferedImage image = ImageIO.read(new File(filename));

ResampleOp  resampleOp = new ResampleOp(rw,(rw * image.getHeight()) / image.getWidth() );
resampleOp.setFilter(ResampleFilters.getLanczos3Filter()); 
image = resampleOp.filter(image, null);

File tmpFile = new File(tmpName);
ImageIO.write(image, "jpg", tmpFile);
重采样过滤器来自库。如果您不喜欢Lanczos3,它还包含BSpline和双三次过滤器等。如果图像不在sRGB颜色空间中,Java会自动将颜色空间转换为sRGB,这是我偶然需要的


Java也会丢失所有EXIF数据,尽管它确实提供了一些很难使用的方法来检索它。对于颜色正确的渲染,您可能希望至少向文件添加一个sRGB标志。为此,请参见。

这里,我在Java EE项目中使用的一些代码应该在正常应用程序中工作,以便:

int rw = the width I needed;

BufferedImage image = ImageIO.read(new File(filename));

ResampleOp  resampleOp = new ResampleOp(rw,(rw * image.getHeight()) / image.getWidth() );
resampleOp.setFilter(ResampleFilters.getLanczos3Filter()); 
image = resampleOp.filter(image, null);

File tmpFile = new File(tmpName);
ImageIO.write(image, "jpg", tmpFile);
重采样过滤器来自库。如果您不喜欢Lanczos3,它还包含BSpline和双三次过滤器等。如果图像不在sRGB颜色空间中,Java会自动将颜色空间转换为sRGB,这是我偶然需要的


Java也会丢失所有EXIF数据,尽管它确实提供了一些很难使用的方法来检索它。对于颜色正确的渲染,您可能希望至少向文件添加一个sRGB标志。为此,请参见。

提供了选择插值类型的额外灵活性,如图所示。

提供了选择插值类型的额外灵活性,如图所示。

您不需要Java来完成此操作。这是浪费时间和资源。如果您有photoshop,您可以通过录制操作来完成此操作:

您不需要Java来完成此操作。这是浪费时间和资源。如果你有photoshop,你可以通过录制动作来完成它:

+1正如其他一些人所说,不需要专门使用Java来实现这一点,但我想你一定知道这一点,并且可能会问,因为你想编写这样的实用程序,或者认为它会很有趣

无论哪种方法,从目录中获取图像文件列表都是很简单的,正确地调整它们的大小需要更多的工作,正如您在谷歌搜索最佳实践和了解实际调整文件大小的9种不同方法时所注意到的那样

我写信就是为了解决这个问题;它是一个死气沉沉的简单API单个类,一堆静态方法,在webapps和其他使用它的工具中得到了很好的采用

调整大小的步骤大致如下所示:

获取文件列表 BuffereImage image=ImageIO.readfiles[i]; image=Scalr.resizeimage,宽度; ImageIO.writeimage; 有许多调整大小的方法可以调用,它们都遵循图像的原始比例。因此,如果仅使用targetWidth(比如1024像素)进行缩放,将计算高度,以确保图像看起来仍然完全正确

如果使用宽度和高度进行缩放,但它们会违反图像的比例并使其看起来被拉伸,则根据图像纵向或横向的方向,将使用一个维度作为定位点,并透明地重新计算另一个不正确的维度

您还可以使用多种不同的质量设置和适合缩放模式,但该库的设计始终是正确的,因此使用它非常简单

您可以通过源代码进行挖掘,它都是Apache2许可的。您可以看到,它实现了Java2D团队在Java中缩放图像的最佳实践,并在其自身之后进行了迂腐的清理,因此没有内存泄漏


希望这会有所帮助。

+1对于其他一些人所说的不需要Java来实现这一点,我想你一定知道这一点,并且可能会问,因为你想编写这样的实用程序,或者认为它会很有趣

无论哪种方法,从目录中获取图像文件列表都是很简单的,正确地调整它们的大小需要更多的工作,正如您在谷歌搜索最佳实践和了解实际调整文件大小的9种不同方法时所注意到的那样

我写信就是为了解决这个问题;它是一个死气沉沉的简单API单个类,一堆静态方法,在webapps和其他使用它的工具中得到了很好的采用

调整大小的步骤大致如下所示:

获取文件列表 BuffereImage image=ImageIO.readfiles[i]; image=Scalr.resizeimage,宽度; ImageIO.writeimage; 有许多调整大小的方法可以调用,它们都遵循图像的原始比例。因此,如果仅使用targetWidth(比如1024像素)进行缩放,将计算高度,以确保图像看起来仍然完全正确

如果你用宽度和高度来衡量,但是他们会 ld违反图像的比例并使其看起来拉伸,然后根据图像纵向或横向的方向,一个维度将用作定位点,另一个不正确的维度将透明地为您重新计算

您还可以使用多种不同的质量设置和适合缩放模式,但该库的设计始终是正确的,因此使用它非常简单

您可以通过源代码进行挖掘,它都是Apache2许可的。您可以看到,它实现了Java2D团队在Java中缩放图像的最佳实践,并在其自身之后进行了迂腐的清理,因此没有内存泄漏


希望对您有所帮助。

您可以使用名为Sizester的桌面图像大小调整应用程序单独或批量调整大小。在我们的网站www.sizester.com上有一个功能齐全的15天免费试用版。

您可以使用名为sizester的桌面图像大小调整应用程序单独或批量调整大小。在我们的网站www.sizester.com上有一个完整的15天免费试用版。

Photoshop有批处理操作:。如果你还想用Java做DIY,看看BuffereImage你确定要用Java吗?类似的东西可能更适合此任务。即使你必须通过Cygwin。如果有任何其他简单的解决方案,我会很高兴这样做:Dif你在windows上,有这个。这有助于一次性转换所有图像。我曾尝试在Photoshop中使用嵌入式图像处理器,但未找到,我使用的是Photoshop 8,因此请指定哪个版本的Photoshop具有批处理操作:。如果你还想用Java做DIY,看看BuffereImage你确定要用Java吗?类似的东西可能更适合此任务。即使你必须通过Cygwin。如果有任何其他简单的解决方案,我会很高兴这样做:Dif你在windows上,有这个。这有助于一次转换所有图像。我曾尝试在Photoshop中使用嵌入式图像处理器,但没有找到,我使用的是Photoshop 8,因此请您指定哪个版本的Photoshop。如果您正在分发应用程序,该版本不起作用。我不会让我的用户为了使用Photoshop的批处理功能而花费数百美元。是的,如果你正在分发应用程序,这是行不通的。我不会让我的用户为了使用Photoshop的批处理功能而花费数百美元。