16 个解决方案
#1
你的代码有问题 贴出来看看
#2
那一块代码用到没及时释放引起的。检查下。
#3
由于代码太乱了~~只粘了画的函数,这个_img不是空,当我把这个_img保存为png格式后,再用Image.FromFile(path);打开时,就不会报内存不足.图也是对的.
PointF[] destinationPoints = { new PointF(_dx + _dw, _dy), new PointF(_dx, _dy), new PointF(_dx + _dw, _dy + _dh) };
g.DrawImage(_img, destinationPoints, _sr, GraphicsUnit.Pixel, imageAttributes);
#4
FileStream MemoryStream 没关闭。把代码贴出来。
#5
当我把这个_img保存为png格式后,再用Image.FromFile(path);打开时,就不会报内存不足.图也是对的.
#6
打开之前把前面的画图片什么的都关闭就好了
g.Dispose();
stream.Close();
g.Dispose();
stream.Close();
#7
_img.Save(@"d:\0.png");
Image img = Image.FromFile(@"d:\0.png");
PointF[] destinationPoints = { new PointF(_dx + _dw, _dy),
new PointF(_dx, _dy),
new PointF(_dx + _dw, _dy + _dh) };
g.DrawImage(_img, destinationPoints, _sr, GraphicsUnit.Pixel, imageAttributes);
这样写就不会报内存不足,为什么会这样呢?
#8
上面写错了~~_img 应该是img
#9
到网上找了~~说用二进制打开了图片,关闭流再画时就会报内存不足~~但是他为什么会报这个内存不足的错误了?
#10
其实不是内存不足,问题很明晰了 【二进制打开了图片,关闭流再画时就会报内存不足】,画图时,它所用到的流必须一直保持打开状态,你关闭了,还怎么画?
#11
同意!
很多底层的模块会报告“内存不足”,不是因为内存不足,而是由于遇到了野指针。
#12
“野指针” 能给点解释吗?我也觉得是对象赋值的问题,可是我用了图片的CLONE还是不行,复制BYTE[]不知道行不行?
#13
//b = Image.FromFile("C:\\13.png");这样可以画b1,我伤不起啊~~~
//MemoryStream ms = new MemoryStream();
//b.Save(ms, ImageFormat.Png);
//byte[] bytes = ms.GetBuffer();
//FileStream fs = new FileStream(@"E:\1231.bit", FileMode.Create, FileAccess.Write);
//BinaryWriter bw = new BinaryWriter(fs);
//bw.Write(bytes.Length);
//bw.Write(bytes);
//bw.Close();
//fs.Close();
FileStream fs1 = new FileStream(@"E:\1231.bit", FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs1);
int count = br.ReadInt32();
byte[] bytesArray = br.ReadBytes(count);
MemoryStream ms1 = new MemoryStream(bytesArray);
b1 = Image.FromStream(ms1);
br.Close();
fs1.Close();
#14
GDI+在绘图时做了优化,从流打开的图片并不会立即全部读入内存中。如果绘制图片有缩略,可以只读取部分数据。
#15
10楼说的有道理,就是你不能直接关闭。
还有就是你可以试着把图片全部读出来放在内存,
所有的操作都是在内存中进行看看行不行。
也就是你13楼的做法。
还有就是你可以试着把图片全部读出来放在内存,
所有的操作都是在内存中进行看看行不行。
也就是你13楼的做法。
#16
感谢大牛们的金玉良言,虽没有答案,却对GDI+,IO懂了多了一些。分不多,平均分了~~
#1
你的代码有问题 贴出来看看
#2
那一块代码用到没及时释放引起的。检查下。
#3
由于代码太乱了~~只粘了画的函数,这个_img不是空,当我把这个_img保存为png格式后,再用Image.FromFile(path);打开时,就不会报内存不足.图也是对的.
PointF[] destinationPoints = { new PointF(_dx + _dw, _dy), new PointF(_dx, _dy), new PointF(_dx + _dw, _dy + _dh) };
g.DrawImage(_img, destinationPoints, _sr, GraphicsUnit.Pixel, imageAttributes);
#4
FileStream MemoryStream 没关闭。把代码贴出来。
#5
当我把这个_img保存为png格式后,再用Image.FromFile(path);打开时,就不会报内存不足.图也是对的.
#6
打开之前把前面的画图片什么的都关闭就好了
g.Dispose();
stream.Close();
g.Dispose();
stream.Close();
#7
_img.Save(@"d:\0.png");
Image img = Image.FromFile(@"d:\0.png");
PointF[] destinationPoints = { new PointF(_dx + _dw, _dy),
new PointF(_dx, _dy),
new PointF(_dx + _dw, _dy + _dh) };
g.DrawImage(_img, destinationPoints, _sr, GraphicsUnit.Pixel, imageAttributes);
这样写就不会报内存不足,为什么会这样呢?
#8
上面写错了~~_img 应该是img
#9
到网上找了~~说用二进制打开了图片,关闭流再画时就会报内存不足~~但是他为什么会报这个内存不足的错误了?
#10
其实不是内存不足,问题很明晰了 【二进制打开了图片,关闭流再画时就会报内存不足】,画图时,它所用到的流必须一直保持打开状态,你关闭了,还怎么画?
#11
同意!
很多底层的模块会报告“内存不足”,不是因为内存不足,而是由于遇到了野指针。
#12
“野指针” 能给点解释吗?我也觉得是对象赋值的问题,可是我用了图片的CLONE还是不行,复制BYTE[]不知道行不行?
#13
//b = Image.FromFile("C:\\13.png");这样可以画b1,我伤不起啊~~~
//MemoryStream ms = new MemoryStream();
//b.Save(ms, ImageFormat.Png);
//byte[] bytes = ms.GetBuffer();
//FileStream fs = new FileStream(@"E:\1231.bit", FileMode.Create, FileAccess.Write);
//BinaryWriter bw = new BinaryWriter(fs);
//bw.Write(bytes.Length);
//bw.Write(bytes);
//bw.Close();
//fs.Close();
FileStream fs1 = new FileStream(@"E:\1231.bit", FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs1);
int count = br.ReadInt32();
byte[] bytesArray = br.ReadBytes(count);
MemoryStream ms1 = new MemoryStream(bytesArray);
b1 = Image.FromStream(ms1);
br.Close();
fs1.Close();
#14
GDI+在绘图时做了优化,从流打开的图片并不会立即全部读入内存中。如果绘制图片有缩略,可以只读取部分数据。
#15
10楼说的有道理,就是你不能直接关闭。
还有就是你可以试着把图片全部读出来放在内存,
所有的操作都是在内存中进行看看行不行。
也就是你13楼的做法。
还有就是你可以试着把图片全部读出来放在内存,
所有的操作都是在内存中进行看看行不行。
也就是你13楼的做法。
#16
感谢大牛们的金玉良言,虽没有答案,却对GDI+,IO懂了多了一些。分不多,平均分了~~