decode Base64 byte Array to Image in C# - asp.net

I am making a small application in android that browse image from the gallery or take a picture from the camera. Then the selected image is compressed and uploaded to the server. I had compressed the image using Base64 String in android and for uploading image i am making a web service in ASP.NET. But i'm not sure how to decode the string(converted using Base64 in android) into image(the web service should be able to convert it). Please help me.
Thanks in advance

You can convert base64string to image by Image.FromStream. You will need to convert the base64string to stream first.
byte[] imageBytes = Convert.FromBase64String(imgBase64String);
Image img = null;
using (MemoryStream ms1 = new MemoryStream(imageBytes))
{
img = Image.FromStream(ms1);
}
if (img != null)
{
// ...
}

Related

Binding Image in ASP.NET MVC4 from a byte array

I am binding an image from a byte array in MVC4 view , The byte array is returned from a WEB API which I need to bind it to a view .
Below is the code
string str="JVBERi0xLjUNJeLjz9MNCjQgMCBvYmoNPDwvRSA0NDc1L0ggWyA3NjMgMTI1IF0vTCA1MTczL0xpbmVhcml6ZWQgMS9OIDEvTyA2L1QgNDcwMj4+DWVuZG9iag0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0xNCAwIG9iag08PC9EZWNvZGVQYXJtcyA8PC9Db2x1bW5zIDQvUHJlZGljdG9yIDEyPj4vRmlsdGVyIC9GbGF0ZURlY29kZS9JRCBbKG5cMzY0XGZcMjM2XDMyNVwyNjJ9XDI2NFwyNzBcMzUwKlwxNzdcMDM3XDM2N1wwMDdcMzE2KSAoblwzNjRcZlwyMzZcMzI1XDI2Mn1cMjY0XDI3MFwzNTAqXDE3N1wwMzdcMzY3XDAwN1wzMTYpXS9JbmRleCBbNCAxMV0vSW5mbyAzIDAgUi9MZW5ndGggNTQvUHJldiA0NzAzL1Jvb3QgNSAwIFIvU2l6ZSAxNS9UeXBlIC9YUmVmL1cgWzEgMiAxXT4+DXN0cmVhbQp4nGNiZBBgYGJg2gAkGHeAiLlAgiEHSPAUMTAxfhADcRkYmf4zffrPxCCQAuS+C2cAALmiCM4KZW5kc3RyZWFtDWVuZG9iag1zdGFydHhyZWYNIDANJSVFT0YNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ01IDAgb2JqDTw8L1BhZ2VzIDIgMCBSL1R5cGUgL0NhdGFsb2cvVmVyc2lvbiAvMS40Pj4NZW5kb2JqDTEyIDAgb2JqDTw8L0ZpbHRlciAvRmxhdGVEZWNvZGUvTGVuZ3RoIDUxL1MgNDE+Pg1zdHJlYW0KeJxjYGBgYWBg+s0ABHzMDKiAGQhZGDgSfBrAXEaoMAsUMzDkMPAwCzAcSJBhAAB7SQQhCmVuZHN0cmVhbQ1lbmRvYmoNNiAwIG9iag08PC9Db250ZW50cyA3IDAgUi9NZWRpYUJveCBbMCAwIDYxMiAxMzNdL1BhcmVudCAyIDAgUi9SZXNvdXJjZXMgPDwvUHJvY1NldCBbL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSV0vWE9iamVjdCAxMCAwIFI+Pi9UeXBlIC9QYWdlPj4NZW5kb2JqDTcgMCBvYmoNPDwvRmlsdGVyIC9GbGF0ZURlY29kZS9MZW5ndGggNDA+Pg1zdHJlYW0KeJxTKOQt5DUzNFIwAEJDY2MwnZzLq++Za6Dgks8byKsQqAAAjOIHjgplbmRzdHJlYW0NZW5kb2JqDTggMCBvYmoNPDwvQml0c1BlckNvbXBvbmVudCA4L0NvbG9yU3BhY2UgMTEgMCBSL0ZpbHRlciAvRENURGVjb2RlL0hSZXMgOTYvSGVpZ2h0IDE3L0xlbmd0aCAzMDE3L1N1YnR5cGUgL0ltYWdlL1R5cGUgL1hPYmplY3QvVlJlcyA5Ni9XaWR0aCA3OD4+DXN0cmVhbQr/2P/gABBKRklGAAEAAAABAAEAAP/+AEFKUEVHIEVuY29kZXIgQ29weXJpZ2h0IDE5OTgsIEphbWVzIFIuIFdlZWtzIGFuZCBCaW9FbGVjdHJvTWVjaC7/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIABEATgMBEQACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AP7Ofil8YP2jvgn4713X9X+Av/C9/wBmW6/sy+tvFH7Pd3dX/wC0d8HbWPR9PHiyTx5+zx4lmj/4Xv8AD/w5/YPi/wAbt4z/AGcfHevftHeIrrxj4E+B3w1/YW+JWteHNZ+LniwA9f8Agp8fvg1+0X4V1Dxj8FfiF4f8e6RoXiC68GeMbTTZp7PxV8NviFpenaVqniH4V/FrwLrEGneNvhD8YPB1trmlRePPhD8TvD3hP4meANRvI9H8aeFNC1dZbFADyD9pX4peO7Hx38Ef2a/htrv/AAqnxb+0t/wsmC2/aG1rTNH1HR/h1o/wu0fQfEPizwj8KtM8S6frHhLx3+1/478JaxrniT4AfDrxtpOo+BNK8CfC79oL9pHxz4d+K3hL9mnWf2fPjQAeP/Db4k/tcfDr9rjwT+yd498bfB/9qnwTrXwf8c/FrxV8XNL8Da38CPjL+zx8PfBGt6H4D+EUnx503wrrnxd+FPxz+MH7WfinXde/4RTUvC/gr9gn4Zzwfs3/ALU3jL4ZeA/ENt4WHwl8CAH6P0AFAHyB+wH+2L4E/wCCgH7G37Pf7Yfw6s/7I8P/ABx+H9n4i1Dw19o1i/8A+EH8d6RfX/hP4pfDr+2dd8MeDL3xL/wrf4m+H/F3gT/hLoPDGkaP4w/4R3/hKPDsEnh/V9MuZgD6/oAKAP5of+DmP41+FfFX/BIz/gqJ8B00/wAQaJ8RPg54f/YS8c6tY6za6c2neJ/hn8Z/2vPhhafD/wCJPhPVNF1XWbZ/D+reNvhX8Zvhtc6H4nPhj4haX4q+EfiXVtR8E23w78S/Czx18Q/8/wD9qR/ygl45/wDeMv8A18Xh8f5//tSP+UEvHP8A7xl/6+Lw+P6Xq/0AP9AD5g+Nf7G37PHx+8Vaf8Q/HXg7xBoXxW03w/a+DLf42/BT4p/Fr9mv4+yfD2z1HVdch+FeofHv9nTx18K/jHq3wffxJrN34tuvhDqnji8+Gd940h0rxnfeFLjxToWh6vpwB8f/ABr/AOCVWnfFbwrp/hfTf20P239C0j4aeILX4k/s0+HPEHx78VeKIPgT8ZbPTtV0S88bN8f9Eu/An/BRD4oeH/H3hDxj8XPhV8TvA3jz9u+8guvg18cviP4K+EuufBnV9C+Bni/4LAB8FPFs/wDwT88K6h8Mvi5+xj4g8I+G9X8QXXiXVP2lP2F/hZ8Zf2tvCv7RfxMv9O0rw/ffE/49fDfwL4a+Jn7eHh39p/4u2HgvUvHvxR8WfFrwv+078PdI0628I6D48/4KJ/Gn4x+JLTTr8A9g/wCHj/wX1H/iX+D/AIK/t/8AjHxbf/6H4W8I/wDDtL9vr4a/8JV4juv3GieHP+Fi/HT9nX4UfBLwD/bmpva6Z/wmvxi+KXw1+FnhX7V/bvxB8f8Ag7wlYav4i04AP7C/ax/ax/cfEPT/AIgfsE/AUfvJ/A3g34pfDbXf2yfjDa3X/Ej8ReCPix42+HWmfEz4Zfsq/D97KDxNNpusfsl/H74k/tHeMbHxX8NPiF4O/aQ/Y38dfDbxd8NvHYAf8O+/Anwu/wCJz+xX8QfiB+xZ4g0z954d+H/w01vWPFH7Gy2sX/E1n8Eal+wp4u1u5/Zy8E/D/wAbeM7bTvFnxY1j9lzw1+zF+0d4vvpfGVz4Z/aQ+H/iD4n/ABF8SeJAA/4WN/wVN/6M3/YA/wDFln7RX/0p2gA/s/8A4Ka/Fb/iVeItT/ZA/Yv8Pp/xL9d1n4T678T/ANuj4p+KdH1z/RtT1P4aeJfil8Lf2MPhl+z98QPAtlbz3Xg3XfiL8FP20fAninxHr+m6h4u+Ftp4f8A6h4T+KwB+UH/BxH8FPCvwN/4N/v29dC0LUPEHirxJ4q8Qfs4eOfin8U/HN1p2qfEz4zfEzVP2sv2aNJ1r4k/EnWtJ0rQtIvPEF5pGhaB4a0PQ/DWgeGPh78NPh74Y8E/CD4QeCfh58HPh58P/AIf+F/8AP/8Aakf8oJeOf/eMv/XxeHx/n/8AtSP+UEvHP/vGX/r4vD4/zZP+HsX/AAVN/wCkln7f/wD4mR+0V/8APGr/AJf/APibL6U//SS/0gP/ABcviL/9EZ/y/wD/ABNl9Kf/AKSX+kB/4uXxF/8AojD/AIexf8FTf+kln7f/AP4mR+0V/wDPGo/4my+lP/0kv9ID/wAXL4i//RGH/E2X0p/+kl/pAf8Ai5fEX/6Iw/4exf8ABU3/AKSWft//APiZH7RX/wA8aj/ibL6U/wD0kv8ASA/8XL4i/wD0Rh/xNl9Kf/pJf6QH/i5fEX/6Iw/4exf8FTf+kln7f/8A4mR+0V/88aj/AImy+lP/ANJL/SA/8XL4i/8A0Rh/xNl9Kf8A6SX+kB/4uXxF/wDojD/h7F/wVN/6SWft/wD/AImR+0V/88aj/ibL6U//AEkv9ID/AMXL4i//AERh/wATZfSn/wCkl/pAf+Ll8Rf/AKIw/wCHsX/BU3/pJZ+3/wD+JkftFf8AzxqP+JsvpT/9JL/SA/8AFy+Iv/0Rh/xNl9Kf/pJf6QH/AIuXxF/+iMP+HsX/AAVN/wCkln7f/wD4mR+0V/8APGo/4my+lP8A9JL/AEgP/Fy+Iv8A9EYf8TZfSn/6SX+kB/4uXxF/+iMP+HsX/BU3/pJZ+3//AOJkftFf/PGo/wCJsvpT/wDSS/0gP/Fy+Iv/ANEYf8TZfSn/AOkl/pAf+Ll8Rf8A6Iw/4exf8FTf+kln7f8A/wCJkftFf/PGo/4my+lP/wBJL/SA/wDFy+Iv/wBEYf8AE2X0p/8ApJf6QH/i5fEX/wCiM8/+KX/BQn9vr44+BNd+Fvxr/bh/a/8AjB8MvFH9mf8ACS/Dr4pftLfGj4geBPEX9iaxp/iLRv7d8I+LPGur+H9X/sjxBpGla7pn9oafcfYNY0zT9TtfKvbK2nj+f4p+kL4+8c5DjuFuNvHHxg4w4YzT6r/afDnFPiXxpxBkOY/UsZh8xwX17KM2zrF5fi/qmYYTCY7C/WMPU+r4zC4fFUuSvRpzj8/xT9IXx945yHHcLcbeOPjBxhwxmn1X+0+HOKfEvjTiDIcx+pYzD5jgvr2UZtnWLy/F/VMwwmEx2F+sYep9XxmFw+KpclejTnH/2QplbmRzdHJlYW0NZW5kb2JqDTkgMCBvYmoNPDwvRmlsdGVyIC9GbGF0ZURlY29kZS9GaXJzdCAxMS9MZW5ndGggNDIvTiAyL1R5cGUgL09ialN0bT4+DXN0cmVhbQp4nDM0UDBQMDRUMDRRsLHR98w1ULAACgTZ2em7pJZlJqcGuTsBAIFSCFYKZW5kc3RyZWFtDWVuZG9iag0xIDAgb2JqDTw8L0ZpbHRlciAvRmxhdGVEZWNvZGUvRmlyc3QgOS9MZW5ndGggMTM0L04gMi9UeXBlIC9PYmpTdG0+Pg1zdHJlYW0KeJwzUjBQMFYwNlewsdF3zi/NK1Ew1PfOTClWiDYDygTF6odUFqQq6AckpqcW29mBFBWlJpZk5ue5JJakKmi4WBkZGJoamBgaGxkYmRqYRhkYqAORpr5vfgoBFQFF+SmlyalFChoBLm4hRfl5CkDaL7VERyHMTM/YwMjEKCZP084OAIrZKrEKZW5kc3RyZWFtDWVuZG9iag0xMyAwIG9iag08PC9EZWNvZGVQYXJtcyA8PC9Db2x1bW5zIDQvUHJlZGljdG9yIDEyPj4vRmlsdGVyIC9GbGF0ZURlY29kZS9JRCBbKG5cMzY0XGZcMjM2XDMyNVwyNjJ9XDI2NFwyNzBcMzUwKlwxNzdcMDM3XDM2N1wwMDdcMzE2KSAoblwzNjRcZlwyMzZcMzI1XDI2Mn1cMjY0XDI3MFwzNTAqXDE3N1wwMzdcMzY3XDAwN1wzMTYpXS9JbmRleCBbMCA0XS9JbmZvIDMgMCBSL0xlbmd0aCAyNC9Sb290IDUgMCBSL1NpemUgNC9UeXBlIC9YUmVmL1cgWzEgMiAxXT4+DXN0cmVhbQp4nGNiAAImRsFqIPG+jYEJyGMEABJTAg0KZW5kc3RyZWFtDWVuZG9iag10cmFpbGVyDTw8L1NpemUgNA0vSUQgWyhuXDM2NFxmXDIzNlwzMjVcMjYyfVwyNjRcMjcwXDM1MCpcMTc3XDAzN1wzNjdcMDA3XDMxNikgKG5cMzY0XGZcMjM2XDMyNVwyNjJ9XDI2NFwyNzBcMzUwKlwxNzdcMDM3XDM2N1wwMDdcMzE2KV0+Pg1zdGFydHhyZWYNMTgyDSUlRU9GDQ==";
Byte[] image = GetBytes(str);
{
Model.ImageData = image;
}
static byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
in view Bind it as
<img src="data:image;base64,#System.Convert.ToBase64String(Model.ImageData)" />
The image is not rendering , it is showing an image icon only in page .
Where it is going wrong .Please suggest .
Your str looks like it is already base64, so you don't need to dance to binary and back. You can just stick it in the view where it should be.
Decoding that string from base64 revealed that it is not an image, it's a pdf file.
So your api (3d party, I guess) serves you not an image.
And lastly to successfully use an image like that you probably need to specify mime type like this <img src="data:image/png;base64,some text representation of binary data" />
http://en.wikipedia.org/wiki/Data_URI_scheme

Is there a cross-platform solution to ImageSource to byte[]?

I did researches and fell on this solution: http://forums.xamarin.com/discussion/22682/is-there-a-way-to-turn-an-imagesource-into-a-byte-array
Initial question: http://forums.xamarin.com/discussion/29569/is-there-a-cross-platform-solution-to-imagesource-to-byte#latest
We want to upload an image through a HTTP Post, here's what we tried:
HttpClient httpClient = new HttpClient ();
byte[] TargetImageByte = **TargetImageSource**; //How to convert it to a byte[]?
HttpContent httpContent = new ByteArrayContent (TargetImageByte);
httpClient.PostAsync ("https://api.magikweb.ca/debug/file.php", httpContent);
We also are having a hard time with the libraries we gotta include in the using clauses. It seems like using System.IO; works, but it doesn't give us access to classes like FileInfo or FileStream.
Anybody has any idea how this can be done aside from custom platform-specific converters?
Possibly a Xamarin.Forms.ImageSource function toByte()?
Lemme know if you need more information.
TargetImageSource is a Xamarin.Forms.ImageSource.
ImageSource TargetImageSource = null;
Solution (Sten was right)
The ImageSource has to originate from another type to exist, that previous type can be converted to a byte[]. In this case, I use the Xamarin.Forms.Labs to take a picture and it returns a MediaFile in which a FileStream is accessible through the Source property.
//--Upload image
//Initialization
HttpClient httpClient = new HttpClient ();
MultipartFormDataContent formContent = new MultipartFormDataContent ();
//Convert the Stream into byte[]
byte[] TargetImageByte = ReadFully(mediaFile.Source);
HttpContent httpContent = new ByteArrayContent (TargetImageByte);
formContent.Add (httpContent, "image", "image.jpg");
//Send it!
await httpClient.PostAsync ("https://api.magikweb.ca/xxx.php", formContent);
App.RootPage.NavigateTo (new ClaimHistoryPage());
The function:
public static byte[] ReadFully(Stream input)
{
using (MemoryStream ms = new MemoryStream()){
input.CopyTo(ms);
return ms.ToArray();
}
}
I think you're looking at it a bit backwards.
ImageSource is a way to provide a source image for Xamarin.Forms.Image to show some content. If you're already showing something on the screen your Image view was populated with data that came from elsewhere, such as a file or resource or stored in an array in memory... or however else you got that in the first place. Instead of trying to get that data back from ImageSource you can keep a reference to it and upload it as needed.
Maybe you can elaborate a bit on your particular need if you don't feel this solution applies to your case.
Pseudo code:
ShowImage(){
ImageSource imageSource = ImageSource.FromFile("image.png"); // read an image file
xf_Image.Source = imageSource; // show it in your UI
}
UploadImage(){
byte[] data = File.ReadAll("image.png");
// rather than
// byte[] data = SomeMagicalMethod(xf_Image.Source);
HttpClient.Post(url, data);
}
UPDATE:
Since you're taking a picture you can copy the MediaFile.Source stream into a memory stream, then you can reset the memory stream's position to point at the beginning of the stream so that you can read it once again and copy it to the http body.
Alternatively you can store the MediaFile.Source to a file and use ImageSource.FromFile to load it in the UI, and when necessary - you can copy the file's contents into an http post body.

In database stored image getting disturb in asp.net

I am working on a project which requires to stored the 32x32 size Icons(png) in table. I am storing the image in table, but when I am getting it to display on page it feels something distorted. These are the png images so somewhere it could be transparent. But when I am showing that image in list of asp.Net page the transparent spaces are filled with black color.
Are there any ways/methods to store the png image in the table without distorting it's quality.
Thanks
This happens when you save Image to byte array with wrong ImageFormat. Use this code:
public byte[] imageToByteArray(string imagePath)
{
return imageToByteArray(System.Drawing.Image.FromFile(imagePath));
}
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
byte[] result = null;
using (MemoryStream ms = new MemoryStream())
{
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
result = ms.ToArray();
}
return result;
}

How do I generate an Image in a ASP.NET ASMX web service and load it via AJAX?

I am currently using a function inside an ASP.Net ASMX web service to generate a System.Drawing.Image. I would like to have this image (after converting to a png or something) passed to the browser as the reply to an AJAX call. (using jQuery's $.ajax). I've been Googling but can't seem to find out how, although I'm pretty sure it's possible. Do I convert it to a Data URI somehow first, or what?
I don't think you can do that. In order to return the image, you should have a method which returns bytearray which I don't think is of any use in javascript.
My workaround is to save the image in a certain location and return the address of the image to clientside.
Update: based on the comments, you can encode the image's data to Base64 string and handle the DATA URI on your ajax callback.
You can use JSON to represent the base64Encoded data, and on the ajax calklback, you can write something like:
$("#myImage").attr("src", "data:image/png;base64,RETURNED_DATA_FROM_ASMX");
Here's a sample code to convert your image to base64 in c#:
public string ImageToBase64(Image image,
System.Drawing.Imaging.ImageFormat format)
{
using (MemoryStream ms = new MemoryStream())
{
// Convert Image to byte[]
image.Save(ms, format);
byte[] imageBytes = ms.ToArray();
// Convert byte[] to Base64 String
string base64String = Convert.ToBase64String(imageBytes);
return base64String;
}
}
To find out how to format a DATA URI, you can visit http://en.wikipedia.org/wiki/Data_URI_scheme#Format.

How to read HtmlDocument in ASP.NET?

i have an aspx page,there is textbox to write an url and a button to show some pictures that are in that url.I can load the url's source code to HtmlDocument.but i dont know how to load pictures from that html source code to show that pictures in my page.How can i do that ? Thanks in advance
You need to make the question more clear so that one can give you a specific answer.
HTML is a markup language which means that there are only format tags, there are no pictures embedded in a .html document. There are only links to images that are urls that can be accessed trough some address. In order to get the images you need to get that url.
If your question is how you can get the actual html from a link then refer to the following question. But, since you say that you can get the html, then you need to parse it using Regex or HTML Agility Pack.
Code to get the image:
byte[] imageData = DownloadData(Url); //DownloadData function from here
MemoryStream stream = new MemoryStream(imageData);
Image img = Image.FromStream(stream);
stream.Close();
for method DownloadData you can use WebClient or WebRequest to get the image in a byte array:
WebRequest req = WebRequest.Create("[URL here]");
WebResponse response = req.GetResponse();
Stream stream = response.GetResponseStream();
byte[] b;
using (BinaryReader br = new BinaryReader(stream))
{
b = br.ReadBytes(size);
br.Close();
}
return b;

Resources