1

我有一张图片,想使用 imgscalr [1] 缩小它。
源图像的大小是 1836 x 3264(所以它是纵向模式),目标分辨率是 1336 x 768。
失败是图像在缩放后处于横向模式而不是纵向模式。缩放本身就像一个魅力。
我的代码:

BufferedImage src = ImageIO.read(new File("sourceimage.jpg"));
BufferedImage scaled = Scalr.resize(src, Scalr.Method.SPEED, Scalr.Mode.FIT_TO_HEIGHT, 1336, 768, Scalr.OP_ANTIALIAS);
ImageIO.write(scaled, "jpg", f);

文件的元数据看起来正确(方向 = 1)。
我的解释是在缩小肖像图片时,在缩放过程之后它仍然是肖像图片。

我还尝试了一些其他库/类,例如:https ://frickelblog.wordpress.com/2009/06/08/fast-image-scaling-in-java/但效果是一样的。

你能帮我么?这个让我发疯!我很确定只有一个细节需要改变。

[1] http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library/#maven

编辑:
这是原始图像: http: //i.stack.imgur.com/NEc8j.jpg
缩放版本:http: //i.stack.imgur.com/SYx6p.jpg

4

2 回答 2

4

所以问题不在于,ImgScar而是在于ImageIOImageIO不会读取图像的方向,因此它被读取为 3264x1836 - Landscape。

所以我最终做的是将图像旋转 90 度......

        BufferedImage src = ImageIO.read(new File("/Users/swhitehead/Downloads/original.jpg"));

        System.out.println(src.getWidth() + "x" + src.getHeight());
        BufferedImage rotated = Scalr.rotate(src, Scalr.Rotation.CW_90, Scalr.OP_ANTIALIAS);
        BufferedImage scaled = Scalr.resize(rotated, Scalr.Method.SPEED, Scalr.Mode.FIT_TO_HEIGHT, 1336, 768, Scalr.OP_ANTIALIAS);
        System.out.println(scaled.getWidth() + "x" + scaled.getHeight());
        ImageIO.write(scaled, "jpg", new File("Scaled.jpg"));

这似乎解决了“这个”问题。

您可以查看ImageIO.read() 始终旋转我上传的图片以获取更多详细信息

于 2015-05-30T23:33:29.980 回答
1

浏览器实现<img>方式不同。
Firefox 不会读取 EXIF 信息,因此纵向图片以横向显示。
Chrome 确实读出了 EXIF 信息,因此肖像保持纵向。

我用这个 CSS 声明修复了它:
image-orientation: from-image;

于 2019-10-30T15:52:05.043 回答