Convert Bitmap into byte[]

DahevosDahevos Dahevos DahevosFRMember
edited February 2013 in Android

Hello,

I have to save a picture into a database (azure).
My data model is cross platform, therefore I can't use "Bitmap" type for my model class. That's why I choose to use byte[].

In android, I have a bitmap. I don't success to convert it into a byte[].
How to do it ?

Posts

  • DahevosDahevos Dahevos Dahevos FRMember

    Hi Chessebaron,

    Thanks for your answer. I already search on the web, and I found that solution.

                            byte[] bigPicBytes = new byte[bigPicCapture.Width * bigPicCapture.Height * 4];
                            MemoryStream stream = new MemoryStream(bigPicBytes);
                            bigPicCapture.Compress(Bitmap.CompressFormat.Png, 80, stream);
                            stream.Flush();
    

    But I had an exception (Compress System.NotSupportedException).
    Seems your code works, so thanks.

  • MassimilianoFabbriMassimilianoFabbri Massimiliano Fabbri USMember

    Hello Tomasz, I'm using that piece of code and at this line:
    bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
    I got from compiler this error:
    [mono] Stacktrace:
    [mono]
    [mono] at (wrapper delegate-invoke) .invoke_bool__this___intptr_intptr_intptr_JValue[] (intptr,intptr,intptr,Android.Runtime.JValue[]) <0xffffffff>
    [mono] at Android.Runtime.JNIEnv.CallBooleanMethod (intptr,intptr,Android.Runtime.JValue[]) <0x00053>
    [mono] at Android.Graphics.Bitmap.Compress (Android.Graphics.Bitmap/CompressFormat,int,System.IO.Stream) <0x001eb>
    [mono] at Discovery_Service.MainActivity.FileSend () <0x000e3>
    [mono] at Discovery_Service.MainActivity/c__AnonStorey0.<>m__3 (object,System.EventArgs) <0x000af>
    [mono] at Android.Views.View/IOnClickListenerImplementor.OnClick (Android.Views.View) <0x00057>
    [mono] at Android.Views.View/IOnClickListenerInvoker.n_OnClick_Landroid_view_View_ (intptr,intptr,intptr) <0x00063>
    [mono] at (wrapper dynamic-method) object.2f4f49ef-aea0-4aad-9fe2-b66db563e805 (intptr,intptr,intptr) <0x00043>
    [mono] at (wrapper native-to-managed) object.2f4f49ef-aea0-4aad-9fe2-b66db563e805 (intptr,intptr,intptr) <0xffffffff>
    Object reference not set to an instance of an object

    bitmap variable is not null, but the issueseems to be the 'stream' object.
    I can't see any problem. Do you ?
    Thanks.
    Max

  • MassimilianoFabbriMassimilianoFabbri Massimiliano Fabbri USMember
    edited August 2013

    I treid other solutions, but my headhake is exponential....
    I got:

    public static int getSizeInBytes(Bitmap bitmap) {
                return bitmap.RowBytes * bitmap.Height;
            }

    `byte[] bitmapData = null; //new byte[1024];

    try {

    ByteBuffer byteBuffer = ByteBuffer.Allocate(getSizeInBytes(_Image));
    _Image.CopyPixelsToBuffer(byteBuffer);
    bitmapData = byteBuffer.ToArray();

    }catch ( Exception err){
    Console.WriteLine (err.Message);
    }
    ......
    ......`
    but I got always the same error and bitmapData is ever null.
    [mono] Stacktrace:
    [mono]
    [mono] at Android.Runtime.JNIEnv.CallIntMethod (intptr,intptr) <0x00047>
    [mono] at Android.Graphics.Bitmap.get_RowBytes () <0x0009b>
    [mono] at Discovery_Service.MainActivity.getSizeInBytes (Android.Graphics.Bitmap) <0x00017>
    [mono] at Discovery_Service.MainActivity.FileSend () <0x000a7>
    [mono] at Discovery_Service.MainActivity/c__AnonStorey0.<>m__3 (object,System.EventArgs) <0x000af>
    [mono] at Android.Views.View/IOnClickListenerImplementor.OnClick (Android.Views.View) <0x00057>
    [mono] at Android.Views.View/IOnClickListenerInvoker.n_OnClick_Landroid_view_View_ (intptr,intptr,intptr) <0x00063>
    [mono] at (wrapper dynamic-method) object.00ee544d-1c90-4c5e-96a0-f917fb0ddeea (intptr,intptr,intptr) <0x00043>
    [mono] at (wrapper native-to-managed) object.00ee544d-1c90-4c5e-96a0-f917fb0ddeea (intptr,intptr,intptr) <0xffffffff>
    Object reference not set to an instance of an object

    ps: code formatting of this forum (and the whole forum system too) sucks!!

  • EvilGeniusJamieEvilGeniusJamie Jamie Duggan GBMember

    @Dahevos:

    The problem you were having is that you were generating the array based on the size of the picture in pixels, based on 4 bytes per pixel - when compressed, the array won't be that large. Using the ToArray function of MemoryStream creates the array only as long as it needs.

    Not 100% but I'm sure there's an issue with creating the memory stream and passing an array to its instantiate function, as it's basically converting this array to a memory stream, then you're trying to over-write the array in the Compress function...

  • thirumalthirumal Thirumaleswara Reddy Kareddy USMember

    can any one help me, how to convert UIImage png or jpg to UIImage bitmap.

  • IcaliberTIcaliberT Icaliber T CNMember

    can anyone help me to give bitmap to image-view
    ??
    i am using xamarin studio..
    i want to convert my text into qrcode..

  • PubuduGayanPubuduGayan Pubudu Gayan NZMember ✭✭✭

    Hi @Dahevos I am agree with @Cheesebaron at least you might need to show what you have tried. but any way check this class.

    @Cheesebaron would appreciate any comment about this class. any comments are appropriate to improve this.

    `
    public static class ImageHelper
    {

        public static async Task<string> GetStreamStringFromImageSourceAsync(StreamImageSource imageSource, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (imageSource.Stream != null)
            {
                var stream = await imageSource.Stream(cancellationToken);
    
                //stream?.Length > 0 can do this - Pubudu
                // stream
                if (stream == null || stream.Length <= 0) return null;
    
                var bytes = new byte[stream.Length];
                stream.Position = 0;
                stream.Read(bytes, 0, (int)stream.Length);
                return Convert.ToBase64String(bytes);
            }
            return null;
        }
    
        public static async Task<StreamImageSource> GetStreamImageSourceFromUrl(string url, CancellationToken cancellationToken = default(CancellationToken))
        {
            StreamImageSource image = new StreamImageSource();
            using (var webClient = new System.Net.Http.HttpClient())
            {
                var imageBytes = await webClient.GetByteArrayAsync(url);
                if (imageBytes != null && imageBytes.Length > 0)
                {
                    return (StreamImageSource) ImageSource.FromStream(() => new MemoryStream(imageBytes));
                }
            }
            return null;
        }
    }
    

    }

    `

Sign In or Register to comment.