在Java中无损JPEG旋转(90/180/270度)?
是否有一个 Java 库可以以 90 度的增量旋转 JPEG 文件,而不会导致图像质量下降?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
是否有一个 Java 库可以以 90 度的增量旋转 JPEG 文件,而不会导致图像质量下降?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
我发现了这个:http://mediachest.sourceforge.net/mediautil/
API:http://mediachest.sourceforge.net/mediautil/javadocs/mediautil/image/jpeg /LLJTran.html
I found this: http://mediachest.sourceforge.net/mediautil/
API: http://mediachest.sourceforge.net/mediautil/javadocs/mediautil/image/jpeg/LLJTran.html
基于 Henry 的回答,以下是如何使用 MediaUtil 基于 EXIF 数据执行无损 JPEG 旋转的示例:
Building on Henry's answer, here's an example of how to use MediaUtil to perform lossless JPEG rotation based on the EXIF data:
关于 EXIF 数据不一定能正确处理的问题,因为 EXIF 数据在许多情况下都是无关紧要的,这里的示例代码仅演示 LLJTran 无损 JPEG 旋转功能(感谢 user113215):
如果您将输入和输出
文件
对象引用同一个文件,您可以一遍又一遍地运行它,并观察到图像不会降级,无论经过多少次迭代。Regarding the issue of EXIF data not necessarily being handled correctly, since EXIF data is irrelevant in many situations, here's example code demonstrating only the LLJTran lossless JPEG rotation feature (with thanks to user113215):
If you make the input and output
File
objects refer to the same file, you can run this over and over again, and observe that the image does not degrade, no matter how many iterations it is put through.特别是对于 Android,我发现了这个分支:
https://github.com/juanitobananas/AndroidMediaUtil
优点上游:
它甚至可以在普通 Java 上使用,因为代码不导入任何 Android 特定的包(但我还没有尝试过)。
For Android specifically, I found this fork:
https://github.com/juanitobananas/AndroidMediaUtil
Benefits over upstream:
It might even be usable on normal Java, as the code does not import any Android-specific package (I haven't tried though).
你不需要外部库来完成这种事情,它都内置在 SE 中。 最简单的是 Graphics2D 对象的rotate() 函数。
例如:
没有损失!
或者,如果您想格外小心,只需使用 BufferedImage.getRGB(x,y),并将其逐像素转换到新图像上。
You don't need an external library for this kind of thing, it's all built into SE. The easiest being the rotate() function of the Graphics2D object.
For example:
no loss!
Or, if you want to be extra careful, just use BufferedImage.getRGB(x,y), and translate it pixel by pixel on to the new image.