安卓位图图像转换为Unity C#纹理

3

我在一个Android视图的绘制循环中:

        Bitmap bitmap = Bitmap.createBitmap(this.getWidth(), 
        this.getHeight(), Bitmap.Config.ARGB_4444);
        Canvas newCanvas = new Canvas(bitmap);
        super.draw(newCanvas);
        Log.d("AndroidUnity","Canvas Drawn!");
        mImageView.setImageBitmap(bitmap);

以上代码显示了我在附加的图像查看器上得到了正确的绘制。

当我将位图转换为字节数组时:

        ByteBuffer byteBuffer = ByteBuffer.allocate(bitmap.getByteCount());
        bitmap.copyPixelsToBuffer(byteBuffer);
        byte[] bytes = byteBuffer.array();

将字节导入Unity不起作用(在我的RawImage上显示为黑色图像):
        imageTexture2D = new Texture2D(width, height, TextureFormat.ARGB4444, false);
        imageTexture2D.LoadRawTextureData(bytes);
        imageTexture2D.Apply();
        RawImage.texture = imageTexture2D;

有没有想法如何将Java bytes[]显示为Unity中的纹理/图像?我已经测试了字节是否正确发送,即当我从android推送{1,2,3,4}的字节数组时,我在unity侧获得{1,2,3,4}。需要注意的是,当尝试以byte[]形式传输字节时,Unity会抛出错误,所以我必须按照C#方面的建议进行操作,具体请参考此处:https://forum.unity.com/threads/androidjavaproxy-lang-reflect-array-exception.257348/
void ReceieveAndroidBytes(AndroidJavaObject jo){
AndroidJavaObject bufferObject = jo.Get<AndroidJavaObject>("Buffer");
byte[] bytes = AndroidJNIHelper.ConvertFromJNIArray<byte[]>(bufferObject.GetRawObject()); }

在Java端,需要一个简单的byte[]容器类“Buffer”。

我可以使用ByteArrayOutputStream out = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);,但我假设这会在双方都需要额外计算,需要检查当质量为100时是否正确。 - pale bone
1个回答

0

我也在尝试做同样的事情,我的初始尝试也有黑色纹理。我使用AndroidJNIHelper.ConvertFromJNIArray进行数组转换,就像你一样,只是我使用了sbyte[]而不是byte[]。为了设置实际的图像数据,我最终使用了

imageTexture2D.SetPixelData(bytes, 0);

如果我没记错,LoadRawTextureData比像素数据数组更原始,这可能是图形卡使用压缩存储纹理的方式。如果是这样,那么原始像素数据不是正确的格式,也无法解码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接