1

我正在研究一些批处理例程来管理大型 jpg 文件库。我有一个很好的例程,可以快速将 4mb+ 文件缩小到 40kb+。使用CCR.Exif,我可以确定是否需要旋转图像。我的问题是在保存之前我找不到任何代码来旋转图像。我真的需要能够做到这一点,而不会产生将图像带到屏幕上的开销。

我正在使用内置的 jpeg.pas;我在CodeCentral找到了 Gabriel Corneanu 的另一个库,但它还没有针对 DXE2 进行更新。我需要做的就是旋转 90°。

任何帮助将不胜感激!

4

3 回答 3

2

JPG 是经过压缩的,必须先渲染,然后才能使用图像数据。即使它是不可见的画布,它们仍然需要加载到呈现它们的组件中。然后,您可以使用 Windows API 调用通过直接访问画布来旋转图像。我以前没有旋转过图像,但我通过访问画布以其他方式对其进行了操作。

GR32 和 EFG 都是具有多种组件和算法的好站点。这是 EFG 网站上旋转图像的一个示例。代码是 Delphi 3,但对于图像处理它仍然可以正常工作。

带有源的 EFG 示例

TImage32也有一种将图像旋转 90 度的方法。见TImage32.Bitmap.Rotate90TImage32是 GR32 库的一部分,并已针对 Delphi-XE2 进行了更新。

svn co https://graphics32.svn.sourceforge.net/svnroot/graphics32/trunk graphics32

另见:GR32 主页

于 2012-08-09T00:30:00.220 回答
1

如果您需要将 JPEG 逐步旋转 90 度,请寻找无损转换。例如 irfanview.com 有一个特殊的插件 DLL,虽然它没有公共 API,但也许你可以向 Irfan 作者索要它或使用调试器和 cff 资源管理器对其进行逆向工程。

很多讨论可能只是通过谷歌搜索,包括讨论它是如何实现的。 https://www.google.ru/search?client=opera&q=lossless+jpeg+rotation

组件目录有类似 http://www.torry.net/quicksearchd.php?String=jpeg+lossless&Title=No

这不适用于比 90 度步长更精细的旋转,但对于正交转弯,请继续 searchign 以进行无损 jpeg 转换。

于 2012-08-09T14:39:33.120 回答
0

旋转 JPEG 图像的最快方法是为 JPEG 解码器编写一个新的/备用像素泵,从左到右 (x,y) 读取和解码 JPEG 像素,并将它们作为 (y,x) 写入位图内存- 也就是说,在相同的偏移量处每条扫描线写入一个像素,而不是在同一条扫描线上每列写入一个像素的正常模式。

其他任何东西都会对位图数据进行多次传递。

于 2012-08-09T01:29:49.377 回答