2017-06-01 62 views
-2

JPEG有许多Marker Segment Levels,我想读写Comment Marker段的级别 - COM(读/写)。如何在Android中访问JPEG COM段?

描述:

JPEG图像具有以下结构:

http://help.accusoft.com/ImageGear/v18.1/Mac/IGDLL-10-05.html

在这方面,http://help.accusoft.com/ImageGear/v18.1/Mac/IGDLL-10-05.html#hs-inthistopic-232092be-8c07-4ae5-9c04-6cff6a52e9f6

在此所有标记段的水平,我特别要编辑COM段,该段是为了评论。

在这个领域我想添加/更新/删除评论,并希望取回所有评论在IOS 同样的问题

How can i access JPEG COM segment in iOS?

我想在Android中实现这一目标。

如何扫描COM标记的JPEG流,读取长度,然后读取数据。只要确保以正确的顺序获得长度字节。

如何跳过具有长度(或固定长度)的其他标记。

如何扫描APPn,DHT,DHQ和COM标记。阅读长度。并跳过所有,但COM标记。

希望你们得到我的问题?

希望你的帮助!!!!谢谢:-)

+0

https://stackoverflow.com/questions/36593739/i-want-to-read-exif-info-in-image-in-android-i-can-read-exif-from-image-in-gall –

+0

我不想使用exif界面阅读评论,我想阅读jpeg文件评论 – Stack

+0

http://help.accusoft.com/ImageGear/v18.2/Windows/ActiveX/IGAX-10-12.html –

回答

0
/* EXIF & PANORAMA XMP MetaData Writer */ 
    IImageMetadata metadata = null; 
    String XmpStringdata = null; 

    JpegImageMetadata jpegMetadata = null; 
    TiffImageMetadata exif = null; 
    TiffOutputSet exifOutputSet = null; 

private File CopyImage(String sourcepath, String targetpath) { 
    File sourceLocation = new File(sourcepath); 
    File targetLocation = new File(targetpath); 

    InputStream in = null; 
    OutputStream out = null; 

    TiffImageMetadata exif = getExifXmpInfo(sourceLocation); 
    try { 
     in = new FileInputStream(sourceLocation); 
     out = new FileOutputStream(targetLocation); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    // Copy the bits from instream to outstream 
    byte[] buf = new byte[1024]; 
    int len; 
    try { 
     while ((len = in.read(buf)) > 0) { 
      out.write(buf, 0, len); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    try { 
     in.close(); 
     new ExifRewriter().updateExifMetadataLossless(targetLocation, out, exif); 
     out.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 


    return targetLocation; 
} 



public TiffImageMetadata getExifXmpInfo(File sourcepath) { 
    metadata = null; 
    XmpStringdata = ""; 
    XmpStringdata = null; 

    /* Get EXIF & XMP data from Image File */ 
    try { 
     // EXIF 
     metadata = Sanselan.getMetadata(sourcepath); 

     // XMP 
     XmpStringdata = Sanselan.getXmpXml(sourcepath); 

     if (metadata == null || !(metadata instanceof JpegImageMetadata)) 
      // comment for no metadata get in 4.3 < device 
      return null; 

     jpegMetadata = (JpegImageMetadata) metadata; 

     exif = jpegMetadata.getExif(); 

     // comment for no metadata get in 4.3 < device 
     if (exif == null) 
      return null; 
     else 
      return exif; 

    } catch (ImageReadException | IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

包括gradle这个罐子库 https://github.com/fulcrumapp/sanselan-android/releases

添加额外的东西,你需要什么

+0

无法解析getXmpXml方法,我认为这会在XP评论中添加注释,我想将它添加到文件注释中 – Stack

+0

已在最新版本库中删除,我有一个工作正常的旧版本。 https://www.dropbox.com/home?preview=jar_sans。jar –

+0

但这段代码是添加xmp注释,我想jpeg文件评论访问 – Stack

0

阅读评论最简单的方法是扫描JPEG流的COM标记,读取长度,然后读取数据。只要确保以正确的顺序获得长度字节。

这里唯一的困难是你需要跳过其他具有长度(或固定长度)的标记。例如,序列FFFE不能出现在压缩数据中,但可能发生在APPn标记内。

因此,您需要扫描APPn,DHT,DHQ和COM标记。阅读长度。并跳过所有,但COM标记。

+0

谢谢,我有一个代码,但只读了一个评论。以下是链接:http://www.java2s.com/Code/Java/2D-Graphics-GUI/GetJpegProperties.htm,但在我的情况下,我想添加/更新/删除多个评论,并获得所有评论。 – Stack

+0

使用JPEG流可以插入和从COM市场删除。要删除,只需复制不复制COM标记的副本。对于插入,在该APPn标记之后添加COM标记(如果存在)。 – user3344003

+0

你能帮我吗?如何从jpeg文件的COM段中读取字节 – Stack