Android字节数组到Bitmap如何

时间:2013-09-05 07:18:37

标签: android bitmap

如何转换使用套接字接收的字节数组。

  1. C ++客户端发送类型为uchar的图像数据。

  2. 在android端,我收到的这个uchar数组为byte [],范围从-128到+127。

  3. 我想要做的是接收这些数据并显示它。为此,我试图使用BitmapFactory.decodeByteArray()转换为位图,但没有运气我得到空位图。我做对了还是其他任何可用的方法。

    提前致谢....

3 个答案:

答案 0 :(得分:9)

从评论到上面的答案,您似乎想要从RGB值流创建一个Bitmap对象,而不是像PNG或JPEG等任何图像格式。

这可能意味着您已经知道图像尺寸。在这种情况下,您可以执行以下操作:

byte[] rgbData = ... // From your server
int nrOfPixels = rgbData.length / 3; // Three bytes per pixel.
int pixels[] = new int[nrOfPixels];
for(int i = 0; i < nrOfPixels; i++) {
   int r = data[3*i];
   int g = data[3*i + 1];
   int b = data[3*i + 2];
   pixels[i] = Color.rgb(r,g,b);
}
Bitmap bitmap = Bitmap.createBitmap(pixels, width, height, Bitmap.Config.ARGB_8888);

答案 1 :(得分:8)

我在我的一个项目中一直在使用它,到目前为止,它已经非常可靠了。我不确定它是多么挑剔,尽管它没有被压缩为PNG。

byte[] bytesImage;
Bitmap bmpOld;   // Contains original Bitmap
Bitmap bmpNew;

ByteArrayOutputStream baoStream = new ByteArrayOutputStream();
bmpOld.compress(Bitmap.CompressFormat.PNG, 100, baoStream);
bytesImage = baoStream.toByteArray();
bmpNew = BitmapFactory.decodeByteArray(bytesImage, 0, bytesImage.length);

编辑:我已经调整了this post中的代码来使用RGB,因此下面的代码应该适合您。我还没有机会测试它,所以可能需要调整一下。

Byte[] bytesImage = {0,1,2, 0,1,2, 0,1,2, 0,1,2};
int intByteCount = bytesImage.length;
int[] intColors = new int[intByteCount / 3];
int intWidth = 2;
int intHeight = 2;
final int intAlpha = 255;
if ((intByteCount / 3) != (intWidth * intHeight)) {
    throw new ArrayStoreException();
}
for (int intIndex = 0; intIndex < intByteCount - 2; intIndex = intIndex + 3) {
    intColors[intIndex / 3] = (intAlpha << 24) | (bytesImage[intIndex] << 16) | (bytesImage[intIndex + 1] << 8) | bytesImage[intIndex + 2];
}
Bitmap bmpImage = Bitmap.createBitmap(intColors, intWidth, intHeight, Bitmap.Config.ARGB_8888);

答案 2 :(得分:0)

InputStream is = new java.net.URL(urldisplay).openStream();
byte[] colors = IOUtils.toByteArray(is);
int nrOfPixels = colors.length / 3; // Three bytes per pixel.
int pixels[] = new int[nrOfPixels];
    for(int i = 0; i < nrOfPixels; i++) {
        int r = (int)(0xFF & colors[3*i]);
        int g = (int)(0xFF & colors[3*i+1]);
        int b = (int)(0xFF & colors[3*i+2]);
        pixels[i] = Color.rgb(r,g,b);
 }
imageBitmap = Bitmap.createBitmap(pixels, width, height,Bitmap.Config.ARGB_4444);
     bmImage.setImageBitmap(imageBitmap );