I'm Trying to Create an Image Object with a Byte Array as Its Source. What Am I Doing Wrong?
-
19-09-2019 - |
Question
I'm trying to create an image object with a byte array as its source. What am I doing wrong?
An exception is thrown when I try to initialize the image object with an array of bytes as source data. The exception is shown in my code, below.
public class MyClass
{
publuc System.Windows.Media.Imaging.BitmapImage InstanceImage { get; set; }
public void GetImage()
{
// Retrieves a list of custom "Item" objects that contain byte arrays.
// ScvClnt is our service client. The PollQueue method is designed to return information to us.
lstQueue = SvcClnt.PollQueue(1);
// This condition always evaluates as True, since we requested exactly 1 "Item" from the service client.
if (lstQueue.Count == 1)
{
// lstQueue[0].InstanceImage is a byte array containing the data from an image file.
// I have confirmed that it is a valid TIFF image file, by writing it to disk and opening it in MSPaint.
if (lstQueue[0].InstanceImage != null)
{
// This condition is also True, since the image is just under 3KB.
if (lstQueue[0].InstanceImage.Length > 0)
{
this.InstanceImage = new System.Windows.Media.Imaging.BitmapImage();
this.InstanceImage.BeginInit();
this.InstanceImage.StreamSource = new System.IO.MemoryStream(lstQueue[0].InstanceImage);
InstanceImage.EndInit();
// The call to EndInit throws a NullReferenceException.
// {"Object reference not set to an instance of an object."}
// I have confirmed that this.InstanceImage and this.InstanceImage.StreamSource are not null at this point.
// They are successfully assigned in the lines of code above.
} else InstanceImage = null;
} else InstanceImage = null;
} else InstanceImage = null;
}
}
I have no idea what on Earth could possibly be going wrong.
Any advice would be much appreciated.
Solution 2
This MSDN forum post uses this example as a solution.
using (MemoryStream stream = new MemoryStream(abyteArray0))
{
image.Source = BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}
//The field image should be of type System.Windows.Controls.Image.
I used the BitmapFrame.Create method that takes only the stream as a parameter, and it worked like a charm.
OTHER TIPS
I'm not sure I'm following what you're trying to do with your class at first glance, but to address the original question, give this a shot:
public static Image ConvertByteArrayToImage(byte[] byteArrayIn)
{
MemoryStream ms = new MemoryStream(byteArrayIn);
Image returnImage = Image.FromStream(ms);
return returnImage;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow