我正在开发一个 TIFF 编码器,以使用新的 JPEG 压缩进行编码(Technote2)。为了使它更像一种新风格的 JPEG,我正在编写 2 个 strip ,并分别编写 JPEG 表。它在大多数情况下工作正常,但在一些特殊情况下 - 图像宽度等于 1000、2000、3000 等,编码图像变成全灰色。我确信问题不是来自任何类型的数据类型溢出,并且没有显示任何错误。我使用 AsTiffTagViewer 检查了标签,但没有发现任何问题。
注意:如果我只写 1 个 strip ,则任何图像尺寸都没有问题。
以下是相关部分:
int rowsPerStrip = imageHeight/2 + 1; // Two strips
JPEGWriter jpgWriter = new JPEGWriter();
// Write first strip
jpgWriter.write(Arrays.copyOfRange(pixels, 0, imageWidth*(imageHeight/2 + 1)), imageWidth, imageHeight/2 + 1, randomOS);
// Another strip
jpgWriter.write(Arrays.copyOfRange(pixels, imageWidth*(imageHeight/2 + 1), pixels.length), imageWidth, imageHeight - imageHeight/2 - 1, randomOS);
这里 randomOS 是一个与 TIFF 一起使用的随机访问输出流,pixels 是整个图像的 int 数组。
对于尺寸为 2000x3000 的一张示例图像,ASTiffTagViewer 显示的标签如下:
> SubFileType (1 Long): Zero
> ImageWidth (1 Long): 2000
> ImageLength (1 Long): 3000
> BitsPerSample (3 Short): 8, 8, 8
> Compression (1 Short): JPEG Technote #2
> Photometric (1 Short): YCbCr
> StripOffsets (2 Long): 8, 82430
> SamplesPerPixel (1 Short): 3
> RowsPerStrip (1 Short): 1501
> StripByteCounts (2 Long): 82422, 82422
> PlanarConfig (1 Short): Contig
> DateTime (24 ASCII): 2014:05:28 13:29:54 EDT
> JpegTables (574 Undefined):
> YCbCrSubsampling (2 Short): 1, 1
> ReferenceBlackWhite (3 Rational):
原始图像只是用橙色填充,相同数量的 StripByteCounts 应该不是问题。
我浏览了 Technote2,试图找到一些我可能错过的东西,但没有成功。我希望这里有人能给我一些线索,告诉我哪里做错了。
最佳答案
只是为了彻底解决这个问题:
问题解决了!这实际上是我的 JPEGWriter 在将图像尺寸扩展到 8 的倍数时的一个错误。感谢 BitBank 激发了讨论。
关于java - 由于某些图像宽度,写入多 strip JPEG 编码的 TIFF 图像失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23918514/