这是我的代码,我试图将两张图片拼接在一起,一旦我到达第42行和第34行;图片img = Image.FromFile(file.FullName);"我得到了一个内存不足的错误。我该怎么办?
namespace Practicing_Stiching
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void cmdCombine_Click(object sender, EventArgs e)
{
//Change the path to location where your images are stored.
DirectoryInfo directory = new DirectoryInfo(@"C:\Users\Elder Zollinger\Desktop\Images");
if (directory != null)
{
FileInfo[] files = directory.GetFiles();
CombineImages(files);
}
}
private void CombineImages(FileInfo[] files)
{
//change the location to store the final image.
string finalImage = @"C:\Users\Elder Zollinger\Desktop\Images";
List<int> imageHeights = new List<int>();
int nIndex = 0;
int width = 0;
foreach (FileInfo file in files)
{
Image img = Image.FromFile(file.FullName);
imageHeights.Add(img.Height);
width += img.Width;
img.Dispose();
}
imageHeights.Sort();
int height = imageHeights[imageHeights.Count - 1];
Bitmap img3 = new Bitmap(width, height);
Graphics g = Graphics.FromImage(img3);
g.Clear(SystemColors.AppWorkspace);
foreach (FileInfo file in files)
{
Image img = Image.FromFile(file.FullName);
if (nIndex == 0)
{
g.DrawImage(img, new Point(0, 0));
nIndex++;
width = img.Width;
}
else
{
g.DrawImage(img, new Point(width, 0));
width += img.Width;
}
img.Dispose();
}
g.Dispose();
img3.Save(finalImage, System.Drawing.Imaging.ImageFormat.Jpeg);
img3.Dispose();
imageLocation.Image = Image.FromFile(finalImage);
}
}
}
答案 0 :(得分:4)
可能是GDI对你耍花招。
您会看到,当GDI遇到未知文件时,很可能会导致OutOfMemoryException
。由于您根本不对输入图像进行过滤,因此我希望您只是抓取非图像文件(或GDI无法理解的图像类型)。
哦,有点侧面 - 确保在保存JPEG时设置JPEG质量 - 默认值为75,这对很多图像来说都是相当糟糕的。并且,请使用using
- 它非常方便确保及时清理:)
答案 1 :(得分:0)
获得更多记忆!
但严重的是,您似乎没有过滤掉非图像文件的文件。文件夹中有一些隐藏文件,您可能会尝试将其作为图像意外打开,例如&#34; Thumbs.db&#34;。确保该文件是if (Path.GetExtension(file.FullPath) != ".png") continue;
之类的图像。
此外,对于您正在调用.Dispose()
的对象,请考虑将其换成using()
。例如:
using(var img = Image.FromFile(file.FullPath))
{
// ...
}