2011-11-08 23 views
0

我一直在使用Java中的ImageIO库将图像转换为缓冲图像。不幸的是,它不能识别我可能传递给它的每种类型的JPEG,所以我需要“转换”这些其他类型。我转换它们的方式是从标准的JFIF JPEG获取现有的APP0标签,我想要做的是在文件的第3个字节插入18个字节的数据(FFE0标记和16字节APP0标签)和那么我想将该文件的其余部分添加到该文件的末尾。什么是通过字节流中途添加数据的最有效方式?

所以推广一下,通过流/文件中途添加/插入数据字节的最有效方法是什么?

先进感谢, 阿列克谢蓝色。

这个问题与我以前的问题有关,所以我想感谢onemasse给出的答案。 Java JPEG Converter for Odd Image Types

回答

0

感谢您的建议家伙,我曾经在第一个FilterInputStream但随后看到有没有必要,我用下面这段代码输入我的APP0十六进制标签:

private static final String APP0Marker = "FF E0 00 10 4A 46 49 46 00 01 01 01 00 8B 00 8B 00 00"; 

而在所需的转换器的方法:

 if (isJPEG(path)) 
     { 
      fis = new FileInputStream(path); 
      bytes = new byte[(int)(new File(path).length())]; 
      APP0 = hexStringToByteArray(APP0Marker.replaceAll(" ", "")); 

      for (int index = 0; index < bytes.length; index++) 
      { 
       if (index >= 2 && index <= (2 + APP0.length - 1)) 
       { 
        b = APP0[index-2]; 
       } 
       else 
       { 
        b = (byte) fis.read(); 
       }//if-else 

       bytes[index] = b; 
      }//for 

      //Write new image file 
      out = new FileOutputStream(path); 
      out.write(bytes); 
      out.flush(); 
     }//if 

希望这有助于具有任何类似的问题:)

0

如果是文件,推荐的方法是将现有文件复制到新文件,在适当的位置插入,更改或删除字节。然后将新文件重命名为旧文件。

从理论上讲,您可以尝试使用RandomAccessFile(或等效)执行现有文件的就地更新。然而,这有点棘手,并不像你想象的那么高效,而且......最重要的......这是不安全的。 (如果您的应用程序或系统在不合时宜的情况下死亡,您将留下一个损坏的文件,并且无法恢复它。)

相关问题