简体   繁体   中英

Xamarin IOS Encoding/Decoding Images from and to Base64

I am working on an application for IOS in Xamarin. I have a menu in which I request something called "Doublechecks". These doublechecks have a field with the name "Medication". In a previous working copy of the app, I simply used a string to fill this field, but now we had the idea to, instead of filling this medication field with a string, to fill it with an image. One of the tips I got was to convert a taken or chosen image to base64.

In the menu where I make a new doublecheck I have a button that pops up an actionsheet, where you can choose weather you want to pick an image from your PhotoLibrary, or take a new picture with your camera. When you've taken or chosen a picture, I use the following method to encode it to Base64:

var imageToSend = originalImage.AsJPEG (0.23f).GetBase64EncodedString (NSDataBase64EncodingOptions.None);

Where the originalImage is the image I took/chose. Now, when requesting all doublechecks, I use the following to decode it:

byte[] encodedDataAsBytes = System.Convert.FromBase64String (imageToDisplay);
string decoded = System.Text.Encoding.ASCII.GetString (encodedDataAsBytes);
NSData data = NSData.FromString (decoded, NSStringEncoding.ASCIIStringEncoding);
return UIImage.LoadFromData (data);

The method works up until the return. Somehow, the UIImage is not being constructed, and has its value null, even though the 'data' contains the decoded string.

I have searched several threads and fora, but without much avail. Any help would be much appreciated.

Why are you converting the base64 decoded data into a string ?

Since you already have the byte array you should be able to simply do:

byte[] encodedDataAsBytes = System.Convert.FromBase64String (imageToDisplay);
NSData data = NSData.FromArray (encodedDataAsBytes);
return UIImage.LoadFromData (data);

NSData method not always a good solution. You can also try following

var rawData = pixelMap.ToByteArray();

        using (var provider = new CGDataProvider(rawData, 0, rawData.Length))
        {
            using (var colorSpace = CGColorSpace.CreateDeviceRGB())
            {
                var cgImage = new CGImage(
                    pixelMap.Width,
                    pixelMap.Height,
                    pixelMap.BitsPerComponent,
                    pixelMap.BytesPerPixel * ByteToBit,
                    pixelMap.BytesPerPixel * pixelMap.Width,
                    colorSpace,
                    CGBitmapFlags.ByteOrderDefault,
                    provider,
                    null,
                    true,
                    CGColorRenderingIntent.Default
                );

                return ImageSource.FromStream(() => UIImage.FromImage(cgImage).AsPNG().AsStream());
            }
        }

Check out my library and samples for more info about both Android and iOS bitmap from/to 2d pixel map. https://github.com/enginkirmaci/Imaging-Library

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