修改JPEG文件的头搭配得当格式

我一直在世界各地的两倍半试图修复一个奇怪的问题用大笔我有图像。

我需要的是知道如何阅读和JPEG文件的标题写的第4和第18个字节。 如果它们匹配的某些属性,我需要做一定的工作和调整这些字节,以反映别的东西。 我这些图片的格式基本上固定到更多的标准格式,如Delphi的不承认他们所在的格式。

那么,如何读/写这些字节? 我该怎么用? 我什么都不知道读取图像文件的原始数据,更不用说调整它。



注意

删除大部分的问题,因为我已经把太多的信息,从一开始。

--------------解决方案-------------

实际上改变JPG头的机制是很容易的。 这并不意味着固定JPG很容易,它只是,如果你知道什么改变,你可以很容易地做到这一点。 因为这是你在问什么,这里是如何改变内存中的JPG头,修改后的JPG加载到TJpgImage并转换为TBitmap。

请注意,我不认为这是一个不错的办法。 固定生成位图是如此的容易得多! 看到我的新的答案,你对如何解决此位图的其他问题。

这里就是你问(如何更改JPG头)的代码:

function LoadJpegIntoBitmap_HeaderFix(const FileName:string): TBitmap;
var M: TMemoryStream;
P: PByteArray;
Jpg: TJPEGImage;
begin
M := TMemoryStream.Create;
try
M.LoadFromFile(FileName);
if M.Size < 18 then raise Exception.Create('File too short.');
P := M.Memory;

// Here you can manipulate the header of the JPG file any way you want.
if P[0] = $07 then P[3] := P[17] - P[0]*3;

// Now load the modified JPG into a TJpgImage
Jpg := TJPEGImage.Create;
try
Jpg.LoadFromStream(M);

// Convert to bitmap
Result := TBitmap.Create;
Result.Assign(Jpg);

finally Jpg.Free;
end;

finally M.Free;
end;
end;

甚至不认为你可以手动调整您的JPEG文件的第一个X字节。

因为它已经被解释的那样,JPEG格式是多种形式和非常复杂的。 以至于一些常用的库不处理所有的可以接受的格式。 打开libjpeg.h ,看看你可以在一个JPEG文件中找到的头结构的一群。

如果你想修改你的头在不改变数据,你还是要与将交出合适的结构,为你修改相关的标志,并保存它回来想要的格式库打开JPEG。

要么找到在Delphi编写或与德尔福接口库,并用它来建立你的批量转换,或者在你的应用程序中打开一个JPEG时,动态转换格式。

如果你知道的性能/标志定义你的问题文件的精确组合,你可以调整jpeg.pas单元以满足您的需要,因为我在以前的答案已经证明。

下面是一些伪代码真快。 我以后会改进。 我要运行。

Assign the Adobe JPEG image file to a TFileStream
Read first 18 bytes and use CompareMem to see if signature matches Adobe RGB JPEG
If RGB JPEG then
We'll either:
Load from stream and tweak the header as we load
OR
Load from stream, copy to TBitmap, and use ScanLine to fix RGB
Else
Load from stream, normally

提示,请参阅LoadFromStream()而不是LoadFromFile()

我不知道你的图像后做什么,所以可能会有一些做更多的工作。

对,所以你的选择是在这里(因为我们已经完全排除了任何任何第三方的代码):

  1. 有些德尔福大师(这我当然不是)出来的木制品,并与标准的德尔福库代码其中存在处理这个照亮着我们,或者,
  2. 你写你自己的JPEG解码的元数据库。

因为我不能帮你的第一个选项,这里是同时追求第二个你需要一些参考:

  • 维基百科的文章JPEG - wiki上更好的写的文章之一。 伟大的介绍材料,这个毛茸茸的主题。
  • ITU T.81 - 原始JPEG规范。 最重要的位是附件B,但这实际上描述称为JIF格式这是不实际使用。 然而,无论JFIF和EXIF是基于它。
  • ICC - 这指定ICC(国际色彩联盟)配置文件,这是这似乎是错了你的头位。
  • 国际刑事法院2010 - 以上规格的新版,与勘误。
  • JFIF - 最JPEG文件实际上使用的格式。
  • EXIF - 另一种格式JPEG文件使用,尤其是那些从数码相机发起。
  • ITU T.84 - 用处不大,这说明JPEG扩展。 我在这里,包括它的完整性。

可悲的是,没有一个公共领域JPEG实现,我所知道的(任何语言)的实际处理的标准,即EXIF和ICC配置文件中的相关位,所以我不能给你,你可以从汲取灵感的任何代码。 寻找最好的地方很可能是libexif ,但这是GPL的。

你会想要做的就是在JPEG文件作为常规文件阅读,根据从上述文件收集的信息分析输入,进行必要的修改,并把它写回去。 我不认为这是一件容易的事,但显然这是你会接受的解决方案。

祝你好运!

分类:图像 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.798 (s). 10 q(s)