java - 由于某些图像宽度,写入多 strip JPEG 编码的 TIFF 图像失败

标签 java image compression jpeg tiff

我正在开发一个 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/

相关文章:

java - 用 Java 重启 Tomcat

java - 使用 Java、Oracle JDBC 处理 Oracle 密码过期和宽限期

java - 删除ArrayList中特定大小的元素

image - 比较FotoJet和Polarr在图像去雾算法上的区别

c++ - 具有随机数据访问的压缩 vector/数组类

javascript - Json压缩传输

c - jpeg文件格式解码

java.lang.IllegalStateException : Could not find matching fulfillment group item for the given order item

image - 连接组件标记算法在某些情况下会失败

python - 使用 PIL/Pillow 打开 PNG