旋转jpg图像文件的最快方法是什么?

时间:2012-08-08 12:11:19

标签: image algorithm delphi delphi-xe2 jpeg

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

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

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

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

GR32和EFG都是具有多个组件和算法的好站点。以下是EFG网站上旋转图像的一个示例。代码是Delphi 3,但它仍然适用于图像处理。

EFG Example with Source

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

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

另见:GR32 Homepage

答案 1 :(得分:1)

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

很多讨论可能只是谷歌搜索,包括讨论如何实施。 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变换。

答案 2 :(得分:0)

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

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