繁体   English   中英

将映像存储在Hbase中,丢失元数据和Exif

[英]Store image in Hbase loss of Meta data and Exif

使用Java程序将图像上传到hbase,在检索图像后,我发现文件大小的差异最终会增加,并且大部分Exif和Meta数据丢失(GPS位置数据,相机详细信息等)。

代码:

public ArrayList<Object> uploadImagesToHbase(MultipartFile uploadedFileRef){
    byte[] bytes =uploadedFileRef.getBytes();
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ImageIO.write(image, "jpg", outputStream);
    HBaseAdmin admin = new HBaseAdmin(configuration);
    HTable table = new HTable(configuration, "sample");
    Put image = new Put(Bytes.toBytes("1"));
    image.add(Bytes.toBytes("DataColumn"), Bytes.toBytes(DataQualifier), bytes);
    table.put(image);

如何存储和检索没有任何更改/丢失的图像?

请尝试使用来自Apache Commons Lang的SerializationUtils

以下是方法

static Object   clone(Serializable object)  //Deep clone an Object using serialization.
static Object   deserialize(byte[] objectData) //Deserializes a single Object from an array of bytes.
static Object   deserialize(InputStream inputStream)  //Deserializes an Object from the specified stream.
static byte[]   serialize(Serializable obj) //Serializes an Object to a byte array for storage/serialization.
static void serialize(Serializable obj, OutputStream outputStream) //Serializes an Object to the specified stream.

当存储到hbase中时,您可以存储从序列化返回的byte []。 在获取对象时,您可以将类型转换为对应的对象,例如ex:File对象,然后可以将其取回。

您很可能只是使事情变得过于复杂。 :-)

之所以丢失Exif和其他元数据,是因为ImageIO便捷方法ImageIO.read(...)ImageIO.write(...)不会保留元数据。 好消息是,不需要它们。

好像您已经从MultipartFile获取图像数据一样,您应该仅将数据(字节数组)存储在数据库中,并且将确切存储用户上传的内容。 文件大小没有差异,并且元数据将保持不变。

您上面的代码无法为我编译,我也不是HBase专家,因此我将其排除在外(因为您已经能够存储图像,以查看大小/质量差异和元数据丢失,所以我假设您知道该怎么做:-))。 但是这里是基础:

public ArrayList<Object> uploadImagesToHbase(MultipartFile uploadedFileRef) {
    byte[] bytes = uploadedFileRef.getBytes();

    // Store the above "bytes" byte array in HBase *as is* (no ImageIO)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM