字节数组图像到位图

时间:2012-07-16 19:49:46

标签: android bitmap bytearray

我正在尝试将字节数组图像转换为位图,但转换后它会给我黑色图像,为什么?

// Camera arg conversion to Bitmap
                Bitmap cameraBitmap = BitmapFactory.decodeByteArray(arg0, 0,
                        arg0.length);
                 Bitmap background = Bitmap.createBitmap(cameraBitmap.getWidth(),
                 cameraBitmap.getHeight(), Bitmap.Config.ARGB_8888);

我想将相机图像转换为位图。任何建议。在此先感谢!!

07-17 02:22:18.149: E/AndroidRuntime(398): FATAL EXCEPTION: main
07-17 02:22:18.149: E/AndroidRuntime(398): java.lang.IllegalArgumentException: only support ImageFormat.NV21 and ImageFormat.YUY2 for now
07-17 02:22:18.149: E/AndroidRuntime(398):  at android.graphics.YuvImage.<init>(YuvImage.java:82)
07-17 02:22:18.149: E/AndroidRuntime(398):  at com.exercise.AndroidCamera.AndroidCamera$4.onPictureTaken(AndroidCamera.java:225)
07-17 02:22:18.149: E/AndroidRuntime(398):  at android.hardware.Camera$EventHandler.handleMessage(Camera.java:320)
07-17 02:22:18.149: E/AndroidRuntime(398):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-17 02:22:18.149: E/AndroidRuntime(398):  at android.os.Looper.loop(Looper.java:123)
07-17 02:22:18.149: E/AndroidRuntime(398):  at android.app.ActivityThread.main(ActivityThread.java:4627)
07-17 02:22:18.149: E/AndroidRuntime(398):  at java.lang.reflect.Method.invokeNative(Native Method)
07-17 02:22:18.149: E/AndroidRuntime(398):  at java.lang.reflect.Method.invoke(Method.java:521)
07-17 02:22:18.149: E/AndroidRuntime(398):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-17 02:22:18.149: E/AndroidRuntime(398):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-17 02:22:18.149: E/AndroidRuntime(398):  at dalvik.system.NativeStart.main(Native Method)

1 个答案:

答案 0 :(得分:3)

不幸的是,相机的图像格式不是ARGB_8888。很可能它就像YUV420p甚至是JPEG压缩数据。

首先,确定你的情况。

您有两种选择:对于YUV(交错格式),使用一些转换格式,JPEG为您的arg0数组创建一个内存流,并从中读取Bitmap。

这里有类似的问题:BitmapFactory null issue in android

这里甚至有一个解决方案:Android byte[] to image in Camera.onPreviewFrame

编辑:你只需稍微破坏数组中的字节。

这个wiki article解释了如何将YUV422 / 420转换为YUY2,这是Android API所要求的。 搜索“Y'UV422也可以用YUY2 FourCC格式代码”表示子串。