GDI +中发生一般性错误将位图保存到c#循环中的文件#

时间:2014-12-11 16:54:10

标签: c#

我将位图保存到我的硬盘驱动器内的文件中(目录中的所有jpeg文件都保存到数据库中)。保存在第一次通过循环时工作正常,但随后在第二次传递时给出主题错误。我想也许文件被锁定所以我尝试为每个传递生成一个唯一的文件名,并且在文件保存后我也在位图上使用Dispose()。知道是什么导致了这个错误吗?

这是我的代码:

private string fileReducedDimName = @"c:\temp\Photos\test\filePhotoRedDim";
...
foreach (string file in files)
{
    int i = 0;

    //if the file dimensions are big, scale the file down
    Stream photoStream = File.OpenRead(file);
    byte[] photoByte = new byte[photoStream.Length];
    photoStream.Read(photoByte, 0, System.Convert.ToInt32(photoByte.Length));
    Image image = Image.FromStream(new MemoryStream(photoByte));
    Bitmap bm = ScaleImage(image);
    bm.Save(fileReducedDimName + i.ToString() + ".jpg", ImageFormat.Jpeg);//error occurs here
    Array.Clear(photoByte,0, photoByte.Length);
    bm.Dispose();

    i ++;
}
...

由于

这是比例图像代码:(这似乎工作正常)

protected Bitmap ScaleImage(System.Drawing.Image Image)
    {
        //reduce dimensions of image if appropriate
        int destWidth;
        int destHeight;
        int sourceRes;//resolution of image
        int maxDimPix;//largest dimension of image pixels
        int maxDimInch;//largest dimension of image inches
        Double redFactor;//factor to reduce dimensions by
        if (Image.Width > Image.Height)
        {
            maxDimPix = Image.Width;
        }
        else
        {
            maxDimPix = Image.Height;
        }
        sourceRes = Convert.ToInt32(Image.HorizontalResolution);
        maxDimInch = Convert.ToInt32(maxDimPix / sourceRes);

        //Assign size red factor based on max dimension of image (inches)
        if (maxDimInch >= 17)
        {
            redFactor = 0.45;
        }
        else if (maxDimInch < 17 && maxDimInch >= 11)
        {
            redFactor = 0.65;
        }
        else if (maxDimInch < 11 && maxDimInch >= 8)
        {
            redFactor = 0.85;
        }
        else//smaller than 8" dont reduce dimensions
        {
            redFactor = 1;
        }
        destWidth = Convert.ToInt32(Image.Width * redFactor);
        destHeight = Convert.ToInt32(Image.Height * redFactor);
        Bitmap bm = new Bitmap(destWidth, destHeight,
            PixelFormat.Format24bppRgb);
        bm.SetResolution(Image.HorizontalResolution, Image.VerticalResolution);
        Graphics grPhoto = Graphics.FromImage(bm);
        grPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

        grPhoto.DrawImage(Image,
            new Rectangle(0, 0, destWidth, destHeight),
            new Rectangle(0, 0, Image.Width, Image.Height),
            GraphicsUnit.Pixel);

        grPhoto.Dispose();
        return bm;

    }

2 个答案:

答案 0 :(得分:1)

如果我正确读取代码,那么每次循环时i变量都为零。

答案 1 :(得分:1)

很难确切地确定出错了什么,我建议你使用using语句来确保你的实例被正确处理掉,但看起来确实如此。

我原本以为它可能是ScaleImage的一个问题。所以我尝试了一个不同的调整大小函数(C# GDI+ Image Resize Function)并且它有效,但i在每个循环开始时始终设置为零。一旦你在循环之外移动我的初始化,你的缩放方法也可以。

private void MethodName()
{
    string fileReducedDimName = @"c:\pics";

    int i = 0;

    foreach (string file in Directory.GetFiles(fileReducedDimName, "*.jpg"))
    {


        //if the file dimensions are big, scale the file down
        using (Image image = Image.FromFile(file))
        {
            using (Bitmap bm = ScaleImage(image))
            {
                bm.Save(fileReducedDimName + @"\" + i.ToString() + ".jpg", ImageFormat.Jpeg);//error occurs here

                //this is all redundant code - do not need
                //Array.Clear(photoByte, 0, photoByte.Length);
                //bm.Dispose();
            }
        }

        //ResizeImage(file, 50, 50, fileReducedDimName +@"\" + i.ToString()+".jpg");

        i++;
    }

}