从位图设置图像

5
Image image = new Image ();
Bitmap bitmap = Bitmap.CreateBitmap (200, 100, Bitmap.Config.Argb8888);
Canvas canvas = new Canvas(bitmap);

var paint = new Paint();
paint.Color = Android.Graphics.Color.Red;
paint.SetStyle(Paint.Style.Fill);

Rect rect = new Rect(0, 0, 200, 100);
canvas.DrawRect(rect, paint);

Android.Widget.ImageView 包含 SetImageBitmap 方法
如何最好地使用我的位图设置 Xamarin.Forms.Image

2个回答

2

通过此链接,有两种方法可以将Bitmap转换为byte[]

  1. var byteArray = ByteBuffer.Allocate(bitmap.ByteCount);
    bitmap.CopyPixelsToBuffer(byteArray);
    byte[] bytes = byteArray.ToArray<byte>();
    return bytes;
    
  2. (in case first solution is still broken)

    ByteBuffer buffer = ByteBuffer.Allocate(bitmap.ByteCount);
    bitmap.CopyPixelsToBuffer(buffer);
    buffer.Rewind();
    
    IntPtr classHandle = JNIEnv.FindClass("java/nio/ByteBuffer");
    IntPtr methodId = JNIEnv.GetMethodID(classHandle, "array", "()[B");
    IntPtr resultHandle = JNIEnv.CallObjectMethod(buffer.Handle, methodId);
    byte[] byteArray = JNIEnv.GetArray<byte>(resultHandle);
    JNIEnv.DeleteLocalRef(resultHandle);
    
然后使用

var image = new Image();
image.Source = ImageSource.FromStream(() => new MemoryStream(byteArray));

创建一个 Image


@Kirill 不要传递流本身。传递一个创建流的方法。请参见答案中代码的最后一行的更改。 - Wosi
2
第一个解决方案有异常,第二个解决方案 - image.Width == -1(也不起作用) - Kirill

0
我尝试了@Wosi的回答,但不知何故之后图像的渲染没有起作用,而且这段代码只适用于Android。我需要将字节数组转换为位图,然后再转回字节数组。以下是我的做法:
将位图转换为字节数组的代码:
        byte[] bitmapData;
        using (var stream = new MemoryStream())
        {
            tempBitmap.Compress(Android.Graphics.Bitmap.CompressFormat.Png, 0, stream);
            bitmapData = stream.ToArray();
        }

将字节数组转换为位图的代码:

 Android.Graphics.Bitmap tempBitmap = Android.Graphics.BitmapFactory.DecodeByteArray(imageByteArray, 0, imageByteArray.Length, options);

其中"options"的定义如下:

        Android.Graphics.BitmapFactory.Options options = new Android.Graphics.BitmapFactory.Options
        {
            InJustDecodeBounds = true
        };
        Android.Graphics.Bitmap result = Android.Graphics.BitmapFactory.DecodeByteArray(bitmapArray, 0, byteArrayLength, options);
        //int imageHeight = options.OutHeight;
        //int imageWidth = options.OutWidth;

在这部分中,位图被解码。这是为了获取图像的高度和宽度属性。对于我的情况,我需要这些信息将其重新编码为字节数组。
因此,可以将字节数组编码为字符串,然后再次转换回来。
从字节数组设置图像源的方法如下:
var imageSource = ImageSource.FromStream(() => new MemoryStream(ImageByteArray, 0, ImageByteArray.Length));

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