【问题标题】:Creating multipage Tiff with Old JPEG compression c#使用旧 JPEG 压缩 c# 创建多页 Tiff
【发布时间】:2015-02-23 15:21:48
【问题描述】:

我有一个 VB6 应用程序(使用 IMGSCAN 和 IMGEDIT 控制)通过 TWAIN 扫描来自 HP 扫描仪的图像,TWAIN 生成具有旧 jpeg 压缩的多页 tiff。现在,当我从同一个 VB6 应用程序通过 TWAIN 访问新的柯达扫描仪 i2600 时,它会挂起。

所以现在我尝试编写一个可执行文件,它只会扫描并创建一个多页 Tiff 文件,可以在我的 VB6 应用程序中访问(通过 IMGEDIT 控制)进行查看。

我尝试使用以下帖子中的 C# 代码创建具有旧 JPEG 压缩的多页 tiff 文件:

https://stackoverflow.com/questions/14811496/tiff-with-jpeg-compression-much-larger-than-original-jpeg

我使用压缩为 6,以实现旧的 JPEG 压缩。 IFD:

{254, 4, 1, 0}, // NewSubfileType
{256, 4, 1, width}, // ImageWidth
{257, 4, 1, length}, // ImageLength
{258, 3, 3, offset}, // BitsPerSample
{259, 3, 1, 6}, // Compression (Old JPEG)
{262, 3, 1, 6}, //PhotometricInterpretation (YCbCr)
{273, 4, 1, offset + 22}, // StripOffsets (offset IFH + entries + values of BitsPerSample & YResolution & XResolution)
{277, 3, 1, 3}, // SamplesPerPixel
{278, 4, 1, length}, // RowsPerStrip
{279, 4, 1, (uint)jpegs[i].LongLength}, // StripByteCounts
{282, 5, 1, offset + 6}, // XResolution (offset IFH + entries + values of BitsPerSample)
{283, 5, 1, offset + 14}, // YResolution (offset IFH + entries + values of BitsPerSample & YResolution)
{284, 3, 1, 1}, // PlanarConfiguration (chunky)
{296, 3, 1, 2} // ResolutionUnit

我成功创建了多页 TIFF 文件。但问题是,IMGEDIT 控件(在 VB6 中)无法正确显示此图像。所有的图像都被扭曲了。

所以我分析了旧 tiff 文件(使用 vb6 应用程序创建)和新文件(使用 c# 创建并具有上述设置)的 IFD。

旧的 Tiff 文件

SUBFILETYPE     0
IMAGEWIDTH  826
IMAGELENGTH     1169
BITSPERSAMPLE   8
COMPRESSION      OJPEG
PHOTOMETRIC      YCBCR
FILLORDER    MSB2LSB
STRIPOFFSETS     System.UInt32[]
ORIENTATION      TOPLEFT
SAMPLESPERPIXEL     3
ROWSPERSTRIP    8
STRIPBYTECOUNTS      System.UInt32[]
XRESOLUTION     100
YRESOLUTION     100
PLANARCONFIG     CONTIG
RESOLUTIONUNIT   INCH
SOFTWARE     System.Byte[]
TILEOFFSETS      System.UInt32[]
TILEBYTECOUNTS   System.UInt32[]
JPEGPROC    1
JPEGIFOFFSET    932
JPEGIFBYTECOUNT     601
JPEGRESTARTINTERVAL     0
JPEGQTABLES     3
JPEGDCTABLES    3
JPEGACTABLES    3
YCBCRSUBSAMPLING    2

新的 Tiff 文件:

SUBFILETYPE  0
IMAGEWIDTH   830
IMAGELENGTH  1172
BITSPERSAMPLE 8
COMPRESSION     OJPEG
PHOTOMETRIC      YCBCR
**< FILLORDER  field missing when comparing above>**
STRIPOFFSETS     System.UInt32[]
< ORIENTATION  field missing when comparing above>
SAMPLESPERPIXEL 3
ROWSPERSTRIP    1172
STRIPBYTECOUNTS   System.UInt32[]
XRESOLUTION     100
YRESOLUTION     100
PLANARCONFIG     CONTIG
RESOLUTIONUNIT    INCH
< SOFTWARE  field missing when comparing above>
TILEOFFSETS        System.UInt32[]
TILEBYTECOUNTS      System.UInt32[]
< JPEGPROC  field missing when comparing above>
< JPEGIFOFFSET  field missing when comparing above>
< JPEGIFBYTECOUNT  field missing when comparing above>
< JPEGRESTARTINTERVAL  field missing when comparing above>
< JPEGQTABLES  field missing when comparing above>
< JPEGDCTABLES  field missing when comparing above>
< JPEGACTABLES  field missing when comparing above>
YCBCRSUBSAMPLING    2

新文件中没有 JPEGPROC、JPEGIFOFFSET、JPEGIFBYTECOUNT、JPEGRESTARTINTERVAL、JPEGQTABLES、JPEGDCTABLES、JPEGACTABLES 等 IFD。我想这可能是 IMGEDIT 控件无法正确显示图像的原因。无论如何在我们生成 TIFF 文件时设置这些属性?

【问题讨论】:

  • 为什么要使用“旧 JPEG”压缩?它的规范有缺陷,永远不应该使用。为什么不使用新的、定义明确的 JPEG 规范?
  • @haraldK 客户端将使用此 VB6 应用程序进行扫描。这个 IMGEDIT,IMGSCAN 控件是旧的,它们仅支持多页 Tiff 文件的“旧 JPEG 压缩”。如果我尝试使用新的 JPEG 压缩创建文件,此控件不会将其识别为有效文件。

标签: jpeg tiff image-compression


【解决方案1】:

很可能您创建的 TIFF 不正确。

重新检查 IMAGEWIDTHSAMPLESPERPIXELBITSPERSAMPLE 值。其中一些可能是错误的,这就是图像失真的原因。

您的输出图像中没有JPEG*** 标签,因为您无法使用 libtiff 创建 OldJPEG 编码的图像(根本没有 OldJpeg 编码器,只有解码器存在)。而且你不应该创建这样的图像,因为 OldJPEG 在很久很久很久以前就被弃用了。

【讨论】:

  • 我已经更新了上面新的 tiff 文件的 IFD。如您所见,它与旧文件值几乎相同,但 JPEG 标签除外。新的 tiff 可以在 microsoft 图片管理器、Irfan viwer 等上查看。只有当我们尝试通过 IMGEDIT 控件查看时才会出现问题。我不知道它是否与 IMGEDIT 控件有关(因为它很旧)。还有其他方法可以创建 OldJPEG 编码的 TIFF 图像吗?
猜你喜欢
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 2010-09-22
  • 2011-05-19
相关资源
最近更新 更多