在hbase中存储映像丢失元数据和exif

wgx48brx  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(469)

用java程序上传一张图片到hbase,检索完图片后发现文件大小的差异最终增大,大部分exif和元数据丢失(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);

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

9cbw7uwe

9cbw7uwe1#

很可能你把事情搞得太复杂了
丢失exif和其他元数据的原因是 ImageIO 便利方法 ImageIO.read(...) 以及 ImageIO.write(...) 不保留元数据。好消息是,他们不需要。
因为你似乎已经有了 MultipartFile ,您只需将该数据(字节数组)存储在数据库中,就可以准确地存储用户上载的内容。文件大小没有差别,元数据将保持不变。
上面的代码不适合我编译,我也不是hbaseMaven,所以我只保留了这一点(因为您已经能够存储图像,以查看大小/质量差异和元数据丢失,我假设您知道如何做到这一点:-))。但基本情况如下:

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

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

emeijp432#

请尝试使用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中存储时,可以存储serialize返回的字节[]。在获取对象时,可以为ex:file对象键入cast到相应的对象,然后可以将其取回。

相关问题