2016-05-13 32 views
0

从一个JFIF图像收集信息工作的扫描开始的最后2个字节我创建了使用Java:什么是一个JPEG/JFIF图像

Image bmp = ImageIO.read(new File("Background1.png")) 
     .getScaledInstance(624, 416, Image.SCALE_SMOOTH); 

BufferedImage tmpBufferedImage = new BufferedImage(bmp.getWidth(null), bmp.getHeight(null), 
     BufferedImage.TYPE_USHORT_565_RGB); 
Graphics2D g = tmpBufferedImage.createGraphics(); 
g.drawImage(bmp, 0, 0, null); 
g.dispose(); 

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageIO.write(tmpBufferedImage, "jpg", baos); 

.... Written to file later. 

我已经创建了几个图片和标题是相同的除了刚好在数据之前。以下是一些标题示例。

FF D8 FF...FF DA 00 0C 03 01 00 02 11 03 11 00 3F 00 F3 EA 
FF D8 FF...FF DA 00 0C 03 01 00 02 11 03 11 00 3F 00 F7 FA 
FF D8 FF...FF DA 00 0C 03 01 00 02 11 03 11 00 3F 00 E2 E8 
FF D8 FF...FF DA 00 0C 03 01 00 02 11 03 11 00 3F 00 F9 FE 

紧随其后的是压缩数据并以FF D9结束。

根据我在JPEG/JFIF上阅读的所有内容,FF DA之后的所有内容都是压缩数据,但为什么00 0C 03 01 00 02 11 03 11 00 3F 00总是在每个图像中?另外,如果有人知道,那最后两个字节是什么?我做了几个单色图像,它们都有一个重复的序列,在最后两个字节之后开始,这让我认为它们必须是某种标题信息。

问题:这12个字节(0C ... 00)是什么,特别是最后2个字节是什么?

更新:所以这些字节被称为扫描开始,我已经找到了一些文件。 00 0C是一个长度(12),这是合理的,因为它加起来就是有问题的字节。关于接下来的8个字节还有一些其他信息,但最后一些我仍然不确定。

最终:这是一个兔子洞,但我要留下的问题,以防有人追逐同一只兔子。最后的两个字节是扫描数据的一部分,因为00 0c显然包含在12字节的计数中。另一位用户在另一个问题上指出了这一点。

+0

你真的不是在询问标题中的最后14个字节(如在标题中);你更关心数据的前14个字节。 –

+0

我更新了我的标题并添加了其他信息 –

回答

2

您需要查看SOS标记的布局。

  • FFDA表示SOS标记。
  • 00OC是标记长度= 12
  • 3 =组件数量。 之后是分配给扫描的扫描ID,霍夫曼和量化表。

接下来是压缩的扫描数据。

显然,无论您使用的是哪种编码器,都会在交错扫描(而不是单独扫描中的每个组件)中编码彩色图像。

FFD9是一个EOI标记,指示JPEG流的结束。

+0

@ user3344004我接受了这个答案,因为它让我回答了我的问题。我将打开另一个问题,我希望你的意见,因为你似乎知道从我在这里找到的其他答案判断jpeg。我会在这里链接问题。 –

+0

请参阅此问题http://stackoverflow.com/questions/37223310/sending-image-directly-to-epson-projector-trouble-decoding-jpeg-image –