使用谷歌应用引擎图像java API无法减少图像大小

时间:2011-04-03 21:42:26

标签: java image google-app-engine resize

我希望在大小超过1MB时缩小图像大小(以KB为单位)。

当我应用宽度较小且高度较小的调整大小变换时,变换图像的大小(以字节为单位)大于原始图像。

有趣(或悲伤)部分甚至是当我调用相同宽度和高度作为缩放尺寸(即尺寸未更改)时,“变换”图像的尺寸大于orig

    final byte[] origData = .....;
    final ImagesService imagesService = ImagesServiceFactory.getImagesService();

    final Image origImage = ImagesServiceFactory.makeImage(oldDate);
    System.out.println("orig dimensions is " + origImage.getWidth() + " X " + origImage.getHeight());

    final Transform resize = ImagesServiceFactory.makeResize(origImage.getWidth(), origImage.getHeight());
    final Image newImage = imagesService.applyTransform(resize, origImage);
    final byte[] newImageData = newImage.getImageData();
    //newImageData.length > origData.length :-(

2 个答案:

答案 0 :(得分:4)

图像编码具有一些您正在观察结果的特殊特征。在从(文件)表示中解码图像时,会生成大量像素。后续编码仅查看像素,并且不知道有关原始文件大小的任何信息。因此,编码步骤是正确的。

常见的JPEG格式以及PNG格式具有不同的压缩级别,即质量设置。他们可以拥有这个,因为他们做有损压缩。一般来说,具有大量细节(锐边)的图像应该以高质量和低质量的模糊图像进行压缩;正如您可能已经看到的那样,小图像通常更模糊,大图像通常更清晰。

不进入技术细节,这意味着您应该根据图像的性质设置质量等级,这也取决于输入图像的大小。换句话说,如果将模糊图像编码为大文件,则会浪费空间,因为使用较少的字节可以获得相同的结果。 但编码器没有此信息,因此您必须使用正确的质量设置对其进行配置

编辑:在你的情况下,如果你开始使用一个小文件(与像素数相比),手动设置一个低质量的编码,然后当相反的情况下,当然是高质量。做一些实验,可能只接受所有照片的单一质量设置。

答案 1 :(得分:1)

我遇到的一个陷阱是,我要求 PNG 输出......并且图像大小也没有改变。图像服务默默地忽略质量参数。根据实施中的评论,质量参数仅适用于 JPEG