7

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

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

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

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

提前致谢....

4

3 回答 3

10

从上面的评论到答案,您似乎想从 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);
于 2013-09-05T08:29:41.787 回答
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);

编辑:我已经修改了这篇文章中的代码以使用 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);
于 2013-09-05T07:45:27.547 回答
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 );
于 2016-07-15T19:14:44.450 回答