我应该如何在C#中管理多个图像

时间:2014-07-01 15:46:29

标签: c# image image-processing

我正在尝试用C#编写程序,允许用户选择一个文件夹,然后一次一个地显示图像,通过两个按钮(即图片浏览器)的平均值来改变图像。然后,用户可以使用一些控件对当前图像进行一些操作,例如改变颜色,从三个图像的平均颜色创建新图像等。

现在,它运行良好,但我只能使用" OpenFileDialog"一次加载一个图像,使用此代码(http://code.msdn.microsoft.com/wpapps/Image-Edge-Detection-5c5a0dc2/view/Reviews)。

        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Title = "Select an image file.";
        ofd.Filter = "Png Images(*.png)|*.png|Jpeg Images(*.jpg)|*.jpg";
        ofd.Filter += "|Bitmap Images(*.bmp)|*.bmp";

        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            StreamReader streamReader = new StreamReader(ofd.FileName);
            originalBitmap = (Bitmap)Bitmap.FromStream(streamReader.BaseStream);
            streamReader.Close();

            previewBitmap = originalBitmap.CopyToSquareCanvas(picPreview.Width);
            picPreview.Image = previewBitmap;

            ApplyFilter(true);
        }

我特别想避免的是将所有图像预加载到数组或类似的东西,因为它会占用大量内存。

仅供参考,这就是用于修改图像的代码。

        BitmapData sourceData = sourceBitmap.LockBits(new Rectangle(0, 0,
                                 sourceBitmap.Width, sourceBitmap.Height),
                                                   ImageLockMode.ReadOnly,
                                              PixelFormat.Format32bppArgb);

        byte[] pixelBuffer = new byte[sourceData.Stride * sourceData.Height];
        byte[] resultBuffer = new byte[sourceData.Stride * sourceData.Height];

        Marshal.Copy(sourceData.Scan0, pixelBuffer, 0, pixelBuffer.Length);
        sourceBitmap.UnlockBits(sourceData);

        //
        // Here would be the image processing    
        //

        Bitmap resultBitmap = new Bitmap(sourceBitmap.Width, sourceBitmap.Height);

        BitmapData resultData = resultBitmap.LockBits(new Rectangle(0, 0,
                                 resultBitmap.Width, resultBitmap.Height),
                                                  ImageLockMode.WriteOnly,
                                              PixelFormat.Format32bppArgb);

        Marshal.Copy(resultBuffer, 0, resultData.Scan0, resultBuffer.Length);
        resultBitmap.UnlockBits(resultData);

        return resultBitmap;

我已阅读图像列表(http://msdn.microsoft.com/en-us/library/windows/desktop/bb761389%28v=vs.85%29.aspx),但我无法操纵"图像。

因此,简而言之,我如何选择一个文件夹并一次显示一个图像?

感谢您的帮助!

0 个答案:

没有答案