我需要能够将Image转换为字节数组然后再返回。我已经关注谷歌搜索结果了,它似乎正在运作......除非它没有:)
我很确定它与内存流有关(我得到了GDI +错误),但我使用"使用"我以为自己是在清理过来的。
private void button1_Click(object sender, EventArgs e)
{
System.Drawing.Image myImage = null;
SetImage(ref myImage); //This one works
SetImage(ref myImage); // This call breaks on
//the first myImage.Save line
}
private void SetImage(ref System.Drawing.Image myImage)
{
try
{
byte[] myImageAsBytes = null;
//First time through we don't have an image already so we load from a file
if (myImage == null)
{
myImage = System.Drawing.Image.FromFile("C:\\temp\\test.jpg");
}
//Convert our Image to a Byte Array.
using (System.IO.MemoryStream myMemoryStream = new System.IO.MemoryStream())
{
myImage.Save(myMemoryStream, myImage.RawFormat);
myImageAsBytes = myMemoryStream.ToArray();
}
//Just debugging
myImage.Dispose();
myImage = null;
GC.Collect();
//And convert it back to an image.
//using (System.IO.MemoryStream myMemoryStream = new System.IO.MemoryStream(myImageAsBytes))
//{
// myImage = System.Drawing.Image.FromStream(myMemoryStream);
//}
System.IO.MemoryStream myMemoryStream2 = new System.IO.MemoryStream(myImageAsBytes);
myImage = System.Drawing.Image.FromStream(myMemoryStream2);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
答案 0 :(得分:0)
我知道delphi而不是C ++。如果myimage是一个对象,我认为你已经将myimage设置为null,所以试图重新创建。或者不要将其设置为null,只需重绘它或myimage.loadfromstream。
System.Drawing.Image myImage = null;
SetImage(ref myImage); //This one works
myimage :=create;
SetImage(ref myImage);
答案 1 :(得分:0)
Image.FromStream的文档:https://msdn.microsoft.com/en-us/library/93z9ee4x(v=vs.110).aspx
表示:
您必须在图像的生命周期内保持流打开。
说到MemoryStreams,关闭/处理它们实际上没有意义。它是唯一可以想到的.NET类,即IDisposable,它不需要处理。它意外地从System.IO.Stream继承了IDisposable,这就是原因。
所以我建议您只创建内存流并让它们成为。
但是,如果您要在物理文件上使用Image.FromStream,可能您不想保持打开状态。在这种情况下你可以做的是像这样制作位图的副本:
Bitmap safeBitmap;
using ( var stream = blah-blah-blah )
using ( var img = Image.FromStream(stream) )
safeBitmap = new Bitmap(img);
答案 2 :(得分:0)
就像从任何地方删除“ref”一样简单
我建议你阅读关键词所做的事情,然后你就会明白为什么要破坏它。
而是从方法中返回新图像。
即。将其从void更改为返回新图像。
<强>更新强>
下面是您的代码的控制台版本,基本上没有修改 它运行良好....虽然我不同意所有的编程。 如果点似乎运行没有错误,那么点就是你得到错误
class Program
{
static void Main(string[] args)
{
Dosomething();
}
private static void Dosomething()
{
System.Drawing.Image myImage = null;
SetImage(ref myImage); //This one works
SetImage(ref myImage); // This call breaks on
}
private static void SetImage(ref System.Drawing.Image myImage)
{
try
{
byte[] myImageAsBytes = null;
//First time through we don't have an image already so we load from a file
if (myImage == null)
{
myImage = System.Drawing.Image.FromFile("C:\\temp\\test.jpg");
}
//Convert our Image to a Byte Array.
using (System.IO.MemoryStream myMemoryStream = new System.IO.MemoryStream())
{
myImage.Save(myMemoryStream, myImage.RawFormat);
myImageAsBytes = myMemoryStream.ToArray();
}
//Just debugging
myImage.Dispose();
myImage = null;
GC.Collect();
//And convert it back to an image.
//using (System.IO.MemoryStream myMemoryStream = new System.IO.MemoryStream(myImageAsBytes))
//{
// myImage = System.Drawing.Image.FromStream(myMemoryStream);
//}
System.IO.MemoryStream myMemoryStream2 = new System.IO.MemoryStream(myImageAsBytes);
myImage = System.Drawing.Image.FromStream(myMemoryStream2);
}
catch (Exception ex)
{
}
}
}