2011-04-11 91 views
6

我正在从网络读取原始图像。该图像已被图像传感器读取,而不是来自文件。如何从原始图像获取位图

这些是我知道关于图像的东西:
〜高度&宽度
〜总大小(以字节计)
〜8位灰度
〜1字节/象素

我试图将此图像转换为位图以在图像视图中显示。

这里是我的尝试:

BitmapFactory.Options opt = new BitmapFactory.Options(); 
opt.outHeight = shortHeight; //360 
opt.outWidth = shortWidth;//248 
imageBitmap = BitmapFactory.decodeByteArray(imageArray, 0, imageSize, opt); 

decodeByteArray返回,因为它不能解码我的形象。

我还试图直接从输入流中读取它,而无需首先将其转换为一个字节数组:

imageBitmap = BitmapFactory.decodeStream(imageInputStream, null, opt); 

这返回为好。

我在这&其他论坛搜索,但无法找到一种方法来实现这一点。

任何想法?

编辑:我应该补充说,我做的第一件事是检查流是否实际上包含原始图像。我使用其他应用程序(iPhone/Windows MFC)&,他们能够读取它并正确显示图像。我只需要找出在Java/Android中执行此操作的方法。

回答

11

Android不支持灰度位图。首先,您必须将每个字节扩展到32位ARGB int。 Alpha是0xff,R,G和B是源图像字节像素值的副本。然后在该数组之上创建位图。

另外(看评论),似乎该设备认为0是白色的,1是黑色的 - 我们必须反转源位。

因此,我们假设源图像位于名为Src的字节数组中。这里的代码:

byte [] src; //Comes from somewhere... 
byte [] bits = new byte[src.length*4]; //That's where the RGBA array goes. 
int i; 
for(i=0;i<src.length;i++) 
{ 
    bits[i*4] = 
     bits[i*4+1] = 
     bits[i*4+2] = ~src[i]; //Invert the source bits 
    bits[i*4+3] = 0xff; // the alpha. 
} 

//Now put these nice RGBA pixels into a Bitmap object 

Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
bm.copyPixelsFromBuffer(ByteBuffer.wrap(bits)); 
+0

@Seva Alekseyev:谢谢你的答案。我尝试了你的建议。我得到一个RuntimeException。根据logcat“缓冲区不够大的像素”。我创建的位图使用宽度&图像的高度 – OceanBlue 2011-04-12 15:25:26

+0

@OceanBlue:消息提示位缓冲区小于4 *宽*高字节长,检查它是否是ARGB_888是每像素4字节格式 – 2011-04-12 15:29:32

+0

@Seva Alekseyev:我知道确保位缓冲区是宽度*高度字节长,图像是每个像素格式1个字节,所以即使我创建了4倍大小的字节数组,图像也会存储在它的前1/4部分。在Android中碰巧知道任何“1字节/像素”格式? – OceanBlue 2011-04-12 21:28:38

1

一旦我做了这样的事情,从相机预览回调获得的字节流进行解码:

Bitmap.createBitmap(imageBytes, previewWidth, previewHeight, 
         Bitmap.Config.ARGB_8888); 

试试看吧。

+1

感谢您的答案。第一个参数“imageBytes”包含什么?在在线Javadoc中看到的Bitmap.createBitmap(...)的所有重载版本中,没有一个将字节数组作为参数。 – OceanBlue 2011-04-12 14:17:53

+1

没有这样的方法。 – Peter 2013-03-03 16:43:19

0

使用来自流的Drawable create。以下是如何使用HttpResponse完成此操作,但无论如何您都可以获得输入流。

InputStream stream = response.getEntity().getContent(); 

    Drawable drawable = Drawable.createFromStream(stream, "Get Full Image Task"); 
+0

感谢您的回答。不幸的是,这也返回null :-(我检查了在线JavaDocs为什么Drawable.createFromStream会返回null http://developer.android。com/reference/android/graphics/drawable/Drawable.html#createFromStream%28java.io.InputStream,%20java.lang.String%29,但没有详细说明。我应该补充一点,我知道流本身是有效的,因为另一个非Android应用程序能够读取它并显示图像。 (我没有该应用程序的源代码)。 – OceanBlue 2011-04-11 21:03:51

+0

似乎你的服务没有正确地返回图像。 – 2011-04-11 21:19:07

+0

当然,这是最可能的可能性,但我已经测试和服务正在返回图像(请参阅我的编辑在问题中)。所以我现在flummoxed :-( – OceanBlue 2011-04-12 14:26:06

相关问题