在C#中转换位图PixelFormats

时间:2010-01-06 21:32:06

标签: c# .net image

我需要将位图从PixelFormat.Format32bppRgb转换为PixelFormat.Format32bppArgb

我希望使用Bitmap.Clone,但它似乎没有用。

Bitmap orig = new Bitmap("orig.bmp");
Bitmap clone = orig.Clone(new Rectangle(0,0,orig.Width,orig.Height), PixelFormat.Format24bppArgb);

如果我运行上面的代码,然后检查clone.PixelFormat,它将设置为PixelFormat.Format32bppRgb。发生了什么/如何转换格式?

3 个答案:

答案 0 :(得分:79)

马虎,GDI +并不少见。这解决了它:

Bitmap orig = new Bitmap(@"c:\temp\24bpp.bmp");
Bitmap clone = new Bitmap(orig.Width, orig.Height,
    System.Drawing.Imaging.PixelFormat.Format32bppPArgb);

using (Graphics gr = Graphics.FromImage(clone)) {
    gr.DrawImage(orig, new Rectangle(0, 0, clone.Width, clone.Height));
}

// Dispose orig as necessary...

答案 1 :(得分:30)

出于某种原因,如果您从文件路径创建Bitmap,即Bitmap bmp = new Bitmap("myimage.jpg");,并在其上调用Clone(),则不会转换返回的Bitmap

但是,如果您从旧版Bitmap创建另一个BitmapClone()将按预期工作。

尝试这样的事情:

using (Bitmap oldBmp = new Bitmap("myimage.jpg"))
using (Bitmap newBmp = new Bitmap(oldBmp))
using (Bitmap targetBmp = newBmp.Clone(new Rectangle(0, 0, newBmp.Width, newBmp.Height), PixelFormat.Format32bppArgb))
{
    // targetBmp is now in the desired format.
}

答案 2 :(得分:7)

using (var bmp = new Bitmap(width, height, PixelFormat.Format24bppArgb))
using (var g = Graphics.FromImage(bmp)) {
  g.DrawImage(..);
}

应该那样工作。也许您想在g上设置一些参数来定义质量等插值模式。