【问题标题】:How to know if a byte array is a valid image如何知道字节数组是否是有效图像
【发布时间】:2015-07-22 10:33:52
【问题描述】:

有没有办法知道一个字节数组是否是一个有效的图像?

我正在拍照,在 OnActivityResult 中:

Bitmap imageBitmap = (Bitmap) extras.get("data");
imageBitmap.compress(Bitmap.CompressFormat.JPEG, 75, out);
//arrayFotos is an ArrayList
arrayFotos.add(new BeanFotos("", imageBitmap, lastKnwonLocation.getLatitude(), lastKnwonLocation.getLongitude()));

我将它存储在数据库中:

//listaFotos and arrayFotos are the same array, but with different names, because I am storing it in another class in my app
for(int i=0;i<listaFotos.size();i++){
values.clear();
values.put("codficha", codficha);
int bytes=listaFotos.get(i).getFoto().getByteCount();
ByteBuffer buffer = ByteBuffer.allocate(bytes);
listaFotos.get(i).getFoto().copyPixelsToBuffer(buffer);
values.put("foto", buffer.array());
db.insert("fotos", null, values);
}

稍后,我需要显示该图像:

byte[] arrayFoto = csr2.getBlob(0);
Bitmap fotoBitmap=BitmapFactory.decodeByteArray(arrayFoto, 0, arrayFoto.length);

问题是,无论我做什么,decodeByteArray 方法总是返回 null。我尝试过使用外部库,它总是为空,所以我想也许我以错误的方式存储它。 arrayFoto 变量不为空,我正在接收字节(准确地说是 84584),但 decodeByteArray 方法返回空。

那么,有没有办法让我确定字节数组是正确的图像?

谢谢。

【问题讨论】:

    标签: android bitmap bytearray android-image


    【解决方案1】:

    您似乎正在将未压缩的位图写入数据库。如果您希望能够使用BitmapFactory 对其进行解码,则需要先将其压缩为 jpeg 或 png。

    此外,将图像存储在数据库中是个坏主意,因为光标窗口大小限制为 1MB。除非二进制数据非常小,否则不应将二进制数据存储在 SQLite 数据库中。

    【讨论】:

    • 尝试将其存储为 Base64 格式,但禁用它以测试是否是问题所在。另外,我将图像压缩为 JPEG 格式,然后从中获取字节。我将图像添加到静态 ArrayList,一旦它被压缩,然后我会从我将数据保存到数据库的类中访问该静态 ArrayList。
    • 不,我很确定您的listaFotos 列表包含Bitmaps 中的getFoto(),而不是压缩图像文件。 Bitmaps 是未压缩的图像,您使用 Bitmap.copyPixelsToBuffer() 将原始字节直接复制到数据库中,这就是您无法将其解码回来的原因。此外,因为它是未压缩的,所以它需要更多的空间。例如,RGBA_8888 格式的 640x480 像素的未压缩图像大约需要 1.2 兆字节,这是巨大的。
    • 要恢复:要修复它,您应该将原始文件的字节复制到您的数据库,而不是解码的位图字节。即使我建议您避免在数据库中存储大的二进制数据;最好将图像保存在文件中(例如,您可以将图像文件名存储在数据库中)。而且 Base64 甚至比二进制更糟糕,因为它增加了 33% 的文件大小(Base64 将 3 个字节的组编码为 4 个 ASCII 字节)。
    • 我想我最终会将文件的路径存储在数据库中而不是文件中。这样就少了很多痛苦。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2020-11-07
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多