简体   繁体   中英

Set image from bitmap

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 contains method SetImageBitmap .
What the best way to set Xamarin.Forms.Image from my bitmap?

Convert the Bitmap to byte[] via http://forums.xamarin.com/discussion/5950/how-to-convert-from-bitmap-to-byte-without-bitmap-compress

There are two solutions mentioned.

  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); 

And then use

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

to create an Image .

I tried @Wosi's answer, but for some reason the rendering of the image after that didn't work and the code is specific to Android. I needed to work from a byte array to a bitmap and then back again. This is what I did:

Code for turning a bitmap into a byte array:

        byte[] bitmapData;
        using (var stream = new MemoryStream())
        {
            tempBitmap.Compress(Android.Graphics.Bitmap.CompressFormat.Png, 0, stream);
            bitmapData = stream.ToArray();
        }

And the code for turning a byte array into a bitmap:

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

Where " options " is defined as follows:

        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;

In this part the Bitmap gets decoded. This is done to get the image height and width properties. For my case I required this information to encode it as a byte array again.

There with this it is possible to encode a byte array to a string and then back again.

Setting an image source from a byte array is done as follows:

var imageSource = ImageSource.FromStream(() => new MemoryStream(ImageByteArray, 0, ImageByteArray.Length));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM