2011-01-26 40 views
17

Trong Android, khi giải mã bitmap từ ảnh trên điện thoại, dữ liệu EXIF ​​trong bản gốc bị mất. Tôi đang gửi Bitmap này đến máy chủ của tôi thông qua một ổ cắm và muốn đính kèm lại dữ liệu EXIF ​​còn thiếu vào dữ liệu đang được gửi.Cách đính kèm siêu dữ liệu EXIF ​​vào một bitmap được tuần tự hóa trong Android?

Tôi có một số mã mà tải một đối tượng Bitmap từ MediaStore và nén nó vào một mảng byte để chuẩn bị để gửi nó qua một ổ cắm:

Bitmap bitmap = ... 
ByteArrayOutputStream stream = new ByteArrayOutputStream(bitmap); 
bitmap.compress(CompressFormat.JPEG, 70, stream); 
byte[] input = stream.toByteArray(); 

Tôi muốn sử dụng ExifInterface để có được tại EXIF siêu dữ liệu trong jpeg gốc trên thẻ SD và bằng cách nào đó thêm nó vào mảng byte gửi đi theo cách tôi có thể trích xuất một jpeg với tất cả EXIF ​​chính xác ở phía máy chủ (hy vọng không làm điều này trên máy chủ). Cho đến nay, tôi quản lý để sử dụng ExifInterface để đọc tất cả các dữ liệu EXIF:

String path = ... //bitmap file path 
ExifInterface exif = new ExifInterface(path); 
... = exif.getAttribute(...) 

EDIT: cách tối ưu, tôi muốn tìm một giải pháp mà không sử dụng thư viện. Nếu tôi chỉ có thể nhận được các chỉ số của mảng byte của jpeg ban đầu chứa EXIF ​​và thêm/thêm các byte này vào mảng byte được sản xuất bởi bitmap.compress(...) sẽ là tốt nhất.

+0

Did bạn thành công với việc thêm thông tin exif để mảng byte? – Vikas

Trả lời

7

Nhờ @Nick CampionSanselan.

đang làm việc:

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
bitmap.compress(CompressFormat.JPEG, 100, bos); //Bitmap object is your image 
byte[] data = bos.toByteArray(); 

TiffOutputSet outputSet = null; 

IImageMetadata metadata = Sanselan.getMetadata(new File(filepath)); // filepath is the path to your image file stored in SD card (which contains exif info) 
JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata; 
if (null != jpegMetadata) 
{ 
    TiffImageMetadata exif = jpegMetadata.getExif(); 
    if (null != exif) 
    { 
     outputSet = exif.getOutputSet(); 
    } 
} 
if (null != outputSet) 
{ 
    bos.flush(); 
    bos.close(); 
    bos = new ByteArrayOutputStream(); 
    ExifRewriter ER = new ExifRewriter(); 
    ER.updateExifMetadataLossless(data, bos, outputSet); 
    data = bos.toByteArray(); //Update you Byte array, Now it contains exif information! 
} 
+0

Mã trên thường không hoạt động như mong đợi với Sanselan Android. Đặc biệt, nếu bạn thay đổi kích thước hình ảnh, mã ở trên sẽ không chỉ sao chép siêu dữ liệu EXIF ​​mà còn ghi đè dữ liệu hình ảnh của bạn, hoàn tác thay đổi kích thước. Dường như là một vấn đề Sanselan khác đã xảy ra: http://mail-archives.apache.org/mod_mbox/commons-user/201103.mbox/%[email protected]%3E. Tôi đã viết về một giải pháp cho vấn đề này ở đây: http://bricolsoftconsulting.com/2012/12/08/copying-exif-metadata-using-sanselan/ – Theo

+0

Nó hoạt động tốt với tôi. nhưng 'Sanselan' sẽ trỏ đến https://commons.apache.org/proper/commons-imaging/ và' Sanselan.getMetadata' trở thành 'Imaging.getMetadata' – Leon

Các vấn đề liên quan