How can i get an Image from a base64 string on Windows Phone 8.1?
I know how to decode the image if that helps?
var imageBytes = Convert.FromBase64String(base64StringWithImageData);
var ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
var decoder = await BitmapDecoder.CreateAsync(BitmapDecoder.PngDecoderId, ms.AsRandomAccessStream());
But nowhere have i found how i can get a Image from any of that.
All of the solutions i have found are for wfp or pre win phone 8.1.
I need this to work in a windows store app.
If possible i don't want to save the image to disk first and then load it.
Background: I get Images (customer signatures) from the server in custom objects where images are stored as base64 encoded strings. So the images aren't stores on a website or on disk.
Update
The answer that was suggested doesn't work for me :(
I changed it a little to get it to compile. The code below is from the suggested answer.
var imageBytes = Convert.FromBase64String(_orderEntity.Signature);
using (var ms = new MemoryStream(imageBytes, 0, imageBytes.Length))
{
ms.Write(imageBytes, 0, imageBytes.Length);
var bitmapImage = new BitmapImage();
await bitmapImage.SetSourceAsync(ms.AsRandomAccessStream());
signatureImage.Source = bitmapImage;
}
But that code throws a "The component cannot be found. (Exception from HRESULT: 0x88982F50)"
Google sais that means that the image format is unknown :(
This is (one of) the strings i use as input:
"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"
I can decompile that string just fine in both a windows Form app:
public static Image Base64ToImage(string base64String)
{
// Convert Base64 String to byte[]
var imageBytes = Convert.FromBase64String(base64String);
var ms = new MemoryStream(imageBytes, 0,
imageBytes.Length);
// Convert byte[] to Image
ms.Write(imageBytes, 0, imageBytes.Length);
var image = Image.FromStream(ms, true);
return image;
}
and a wpf app:
public static Image Base64ToImage(string base64String)
{
try
{
byte[] binaryData = Convert.FromBase64String(base64String);
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.StreamSource = new MemoryStream(binaryData);
bi.EndInit();
Image img = new Image();
img.Source = bi;
return img;
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
return new Image();
}
So why cant i get it to work on Windows Phone??
I found a solution that works!
var imageBytes = Convert.FromBase64String(base64String);
using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream())
{
using (DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0)))
{
writer.WriteBytes((byte[])imageBytes);
writer.StoreAsync().GetResults();
}
var image = new BitmapImage();
image.SetSource(ms);
}
Found the solution here: Load, show, convert image from byte array (database) in Windows Phone 8.1
and there is a the solution here: http://www.codeproject.com/Tips/804423/Conversion-between-File-Byte-Stream-BitmapImage-an
Related
in my app I'm uploading images to server. I encode image from my WP 8.1 and send it to server. Sending and receiving work well but I have problem with image. I don't know why but whem I uploaded the image photographed on portrait after decoding is this image rotated by 90 degrees. Landscapes images are good, but portrait are rotated. Here is my encode and decode code
Encode:
private async Task<string> StorageFileToBase64(StorageFile file)
{
string Base64String = "";
if (file != null)
{
IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read);
var reader = new DataReader(fileStream.GetInputStreamAt(0));
await reader.LoadAsync((uint)fileStream.Size);
byte[] byteArray = new byte[fileStream.Size];
reader.ReadBytes(byteArray);
Base64String = Convert.ToBase64String(byteArray);
}
return Base64String;
}
Decode image on server
public void ShowImg(string b64)
{
byte[] imageBytes = Convert.FromBase64String(b64);
// Convert byte[] to Image
var ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
Image image = Image.FromStream(ms, true);
f.pictureBox1.Image = image;
}
string startExpression = "data:image/png;base64,";
using (var ms = new MemoryStream())
{
ms.Flush();
System.Drawing.Image imageIn = System.Drawing.Image.FromFile(fileName);
ms.Position = 0;
imageIn.RotateFlip(System.Drawing.RotateFlipType.Rotate90FlipX);
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
var bytes= ms.ToArray();
string fileBase = Convert.ToBase64String(bytes);
var base64= startExpression + fileBase;
imageIn.Dispose();
ms.Dispose();
}
I'm trying to convert base64 string to image and bind the result.
This is my xaml :
<Image Source="{Binding image64}">
To be sure my base64 string is correct i did that :
public BitmapImage image64
{
get
{
**//Convert my path img to Base64.**
byte[] bytes = System.Text.UTF8Encoding.UTF8.GetBytes(image);
string base64String = System.Convert.ToBase64String(bytes);
MessageBox.Show("Base 64 String :[" + base64String + "]");
//Convert my img base64 to img.
byte[] fileBytes = Convert.FromBase64String(base64String);
using (MemoryStream ms = new MemoryStream(fileBytes, 0, fileBytes.Length))
{
ms.Write(fileBytes, 0, fileBytes.Length);
BitmapImage bitmapImage = new BitmapImage();
**bitmapImage.SetSource(ms);**
return bitmapImage;
}
}
}
This code don't work in my case because of setSource. I found this "solution" here :
similar question 1
similar question 2
But they don't work in my case, i think it's because they didn't use the binding. And i don't have any idea to fix it...
Sorry for my english, and i hope someone can help me :)
I found this solution, it works perfectly.
byte[] filebytes = Convert.FromBase64String(image);
MemoryStream ms = new MemoryStream(filebytes, 0, filebytes.Length);
BitmapImage mimage = new BitmapImage();
mimage.SetSource(ms);
return mimage;
I cannot decode images back from their encoded form as a (Jpeg) byte array retrieved from my database to be used as image sources for my WPF application.
The code I am using to encode them as a Jpeg byte array is as follows:
public byte[] bytesFromBitmap(BitmapImage bit)
{
byte[] data;
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bit));
using (MemoryStream ms = new MemoryStream())
{
encoder.Save(ms);
data = ms.ToArray();
}
return data;
}
This is taking my Image taken directly from a webpage and assigned to an Image control like so:
var img = new BitmapImage(new Uri(entity.Image.ImageSrc)); //the entity has been saved in my DB, having been parsed from html
pbImage.Source = img;
This works just fine, I encode the BitmapImage and it saves just fine. But when I retrieve it from the DB and try to display it in another window, I cannot get it to work after trying every example I can see online - all either render nothing, or a black box or a visual mess not at all similar to the image I encoded.
Neither of the following have worked for me:
public BitmapSource GetBMImage(byte[] data)
{
using (var ms = new MemoryStream(data))
{
JpegBitmapDecoder decoder = new JpegBitmapDecoder(ms, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource frame = decoder.Frames[0];
return frame;
}
}
public static BitmapImage ImageFromBytes(byte[] imageData)
{
if (imageData == null)
{
return null;
}
else
{
var image = new BitmapImage();
using (var mem = new MemoryStream())
{
mem.Position = 0;
image.BeginInit();
image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = null;
image.StreamSource = mem;
image.EndInit();
}
image.Freeze();
return image;
}
} //this throws a 'No imaging component suitable to complete this operation was found' exception
Among other uses of memory streams and decoders I just can't get this to work - can anyone help?
I have the following code to convert image to base64:
private void btnSave_Click(object sender, RoutedEventArgs e)
{
StreamResourceInfo sri = null;
Uri uri = new Uri("Checked.png", UriKind.Relative);
sri = Application.GetResourceStream(uri);
BitmapImage bitmap = new BitmapImage();
bitmap.SetSource(sri.Stream);
WriteableBitmap wb = new WriteableBitmap(bitmap);
MemoryStream ms = new MemoryStream();
wb.SaveJpeg(ms, bitmap.PixelWidth, bitmap.PixelHeight, 0, 100);
byte[] imageBytes = ms.ToArray();
base64 = System.Convert.ToBase64String(imageBytes);
}
And the following code to get Bitmap image form base 64:
public static BitmapImage base64image(string base64string)
{
byte[] fileBytes = Convert.FromBase64String(base64string);
using (MemoryStream ms = new MemoryStream(fileBytes, 0, fileBytes.Length))
{
ms.Write(fileBytes, 0, fileBytes.Length);
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(ms);
return bitmapImage;
}
}
So when i convert and deconvert it is blank.
I know that deconverter works, because, when i give him exact string:
string base64="iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAQAAABLCVATAAACH0lEQVR42q3WoZKrMBQGYGRkIpHEoY9DMrh1nUGtzxPcGV7gCsTaK3iBCqa2ipmrVqLrWrmytjL3nBwoEGD30ja/6JaSj/wp3SEIXjpUoB+Oeg0zpoR+NsyoDVOgi39cbYHAy4MQTc0wOYZepxRBUkn9UxxEiNnXxyYwd6w/438hSddHJilv1tqv664Shle1DeJaJihPV9uNQ+NWBRK2QVSr+GjtaFzOIpdjKFShnoY+Gv0N0u0OVLexY48NQ+68JchdpQu/o1piVMu6faJdwjNWIAYyl55bqGUtbndO53TzCIpUpCkdlEm+V3J3Ir8r3uops2+FkTmvx832IGJwN97xS/5Ti0LQ/WLwtbxMal2ueAwvc2c8CAgSJip5U4+tKHECMlUzq2UcA9EyROuJi6/71dtzWAfVcq0Jw1CsYh13kDDteVoirE+zWtLVinQ8ZAS5YlVlvRHWfi3pakUQL0OOwmp/W/vN6Gt5zBIkzEezxnCtMJsxDIECTYmhp3bej4HHzaalNMyAnzE0UBKp6Z1Do2pwd3JkAH6CxlTs/bZOZ661yMwhohDLQqREMWz8UAvWoUQleggehG5dSPUbv28GJlnKHGJsqPi7vuG/MGTyCGslOtkCOayrGOa/indajdudb6FUpXoepgiLHIIMriddyzrkMBhGAqlOH4U2hKCT2j0NdU8jFbzpZ3LQlh9srPqEQ1Y9lEP2CVa99KHvH8mnrGGdl9V9AAAAAElFTkSuQmCC";
Which is my Checked.png converted in online converter. It decompreses perfectly.
And this is my base64, which i get by converting:
"/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAAkACQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+AXyv978v/rUeV7N+X/1q0FhyFxnlc9vT6d+APcgV2HiL4cePvCGheCvFHizwR4w8L+GfiVo9/wCIvhz4i8ReGda0TQfH3h/S9av/AA3qeueCtX1OxtdP8V6Pp3iLS9U0G+1PQbm/srTWtNv9LnnjvrO4gjAOO0rRtS1zUtP0bRtPv9W1fVr600zS9K0y0nv9S1PUr+eO1sdP0+xtY5bq8vby6mitrW1t4pJ7ieWOGGN5HVS/WND1Xw9qup6Frumajout6JqN7pGs6Nq1lcadqukatptzLZajpmp6deRQ3dhqFhewTWl7ZXUMVza3MMsE8ccqMg/tk/4NKv8Agjy3xm+JkH/BTj9oDwss3wm+DXiC70v9l3QNZtEktfHvxp0Sd7XVvin9mucpc+Hfg9cB7PwxdC1lhu/irIdR0/UbPVfhdeW13yf/AAeM/Fj9iTXf2pvhp8IPg/8ACjwRJ+2H4N02PxJ+1F8dPCpbStUi0bWdGhX4e/CLxnY6TPBpHjPxmdHms/GWpeIfEthc+JPCXhj/AIQTw9o+tyafrms6PpYB/Fiy7Tjn8aKluV2yY/2RRQB7r8CtS+E3h34wfCvxD8efBvib4hfBXRfHnhLVfir4E8G+ILfwv4o8YeALLWLO58UeHtD1+5t7mLTNQ1TSUurSKY/ZJZPN8i31XRLiWLWLL/W48Q/Bf/gmX/wXm/4Jg6V8PfgkPhtqfwYT4ey+EfgFrOleDorLxX+xt8SNA8Jnwz4Ot4fh9pmseE9d8E6x8M2t9Jt9T+HEOveHvD/jvwbY2+l2uq6n4D8Q6Vrd3/kEQxfuYiMcxp3PdB+Fff8A/wAE7v8AgpB+1H/wTJ+Omn/Gv9mzxpLp9veT6ba/Ez4Wa1NdXXwy+L/hayunmPhzxx4eS4ijnmhjuL1dC8UaebXxX4Unvry58P6tZi+1GG7AP9Q3/gpJ+2p+zz/wQi/4JraUnww8MeHNE1Lwp4PsfgV+x58FbcKIvEPju20OSDR9R1i3iaG81Dw34RiSbx98U/Ed3PBe69Ik1nc6w3jPxro7ah/kLfEnx946+L/xB8b/ABV+JviXVvG3xF+I/ivXvG/jrxdrlws+r+JfFfibU7nV9c1nUZQsStdX+o3dxcyCKKG3jMnlW0ENvHFGv6ff8Fgf+CqPxQ/4K0ftQQfHDxdoEnw7+HHgrwxZeCfgx8HY/EDeI7H4f6AUhv8AxNfXeqrY6Tba34q8X+JjcalrmvpoumS3OmWnhnw+8Mtj4YsGH5ReT9PzNAHF6guy4K4wdi5HXrmip9YXbesP+mcfr6UUAdHb+NTFbwQ3Hhnw5qE0MUcT310fEUd1ciKNI0e4Fh4hsrRptqDzJY7WOSeQvNO0szvI0v8AwnEX/QneFf8Av74t/wDmroooAP8AhOIv+hO8K/8Af3xb/wDNXSjxzECD/wAIb4UODnBl8XYPsceLAcH2IPoRRRQByWp6g+p3kl21taWm8KqW1lE0UEUaDaiKZZJriUgcGa6uLi4fjzJnwMFFFAH/2Q=="
My problem is that string which i get as base64 from my code - is incorrect *What i did wrong?*
What about trying:
public static BitmapImage base64image(string base64string)
{
byte[] fileBytes = Convert.FromBase64String(base64string);
using (MemoryStream ms = new MemoryStream(fileBytes))
{
Image streamImage = Image.FromStream(ms);
context.Response.ContentType = "image/jpeg";
streamImage.Save(context.Response.OutputStream, ImageFormat.Jpeg);
return streamImage;
}
}
I agree with Alexei that your code for reading the image in does look a little strange. I've recently written some code for a similar task that I was doing which might point you in the right direction:
string fileContent = null;
/* Check the file actually has some content to display to the user */
if (uploadFile != null && uploadFile.ContentLength > 0)
{
byte[] fileBytes = new byte[uploadFile.ContentLength];
int byteCount = uploadFile.InputStream.Read(fileBytes, 0, (int)uploadFile.ContentLength);
if (byteCount > 0)
{
fileContent = CreateBase64Image(fileBytes);
}
}
private string CreateBase64Image(byte[] fileBytes)
{
Image streamImage;
/* Ensure we've streamed the document out correctly before we commit to the conversion */
using (MemoryStream ms = new MemoryStream(fileBytes))
{
/* Create a new image, saved as a scaled version of the original */
streamImage = ScaleImage(Image.FromStream(ms));
}
using (MemoryStream ms = new MemoryStream())
{
/* Convert this image back to a base64 string */
streamImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
return Convert.ToBase64String(ms.ToArray());
}
}
not an answer: more of a long comment ... OP states that decoding code works perfectly fine, also it looks suspicios. Also code assumed to be verified to work on PNG images, but saving code explicitly produces valid JPG with SaveJpeg call...
Your code that creates stream for reading looks strange - you create stream over existing byte array, than write the same bytes into that stream, and that pass that stream without seeking back to 0 to some method.
Potential fix (assuming BitampImage can accept JPG stream):
don't call Write at all as stream already have the bytes you want
set ms.Position = 0 after writing to the stream.
Note: I'm not sure if it is OK to dispose stream that is a source for BitmapImage, you may need to remove using too.
I have a base64 string and I want convert that to an image and set the Source of an Image control to the result of that.
Normally I would do that using Image.FromStream, similar to this:
Image img;
byte[] fileBytes = Convert.FromBase64String(imageString);
using(MemoryStream ms = new MemoryStream())
{
ms.Write(fileBytes, 0, fileBytes.Length);
img = Image.FromStream(ms);
}
However, the Image.FromStream method does not exist on Windows Phone, and a casual search only turns up results that depend on that method.
You can use a method like this:
public static BitmapImage base64image(string base64string)
{
byte[] fileBytes = Convert.FromBase64String(base64string);
using (MemoryStream ms = new MemoryStream(fileBytes, 0, fileBytes.Length))
{
ms.Write(fileBytes, 0, fileBytes.Length);
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(ms);
return bitmapImage;
}
}
Add an image to your XAML, such as this:
<Image x:Name="myWonderfulImage" />
You can then set the source, like this:
myWonderfulImage.Source = base64image(yourBase64string);