我最近发现了一个与在C#中将位图格式转换为24位RGB有关的问题的答案:更快地复制图像以更改其PixelFormat,其中所选答案说明如下:
让我们使用这个函数将一个32位ARGB图像转换为24位RGB。我有以下几个问题:
另一种方法是锁定没有Alpha通道的比特,并将内存复制到新的位图中
以下代码作为示例提供(简化版本):
public static Bitmap RemoveAlphaChannel(Bitmap bitmap) {
Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
Bitmap bitmapDest = new Bitmap(bitmap.Width, bitmap.Height, PixelFormat.Format24bppRgb);
BitmapData data = bitmap.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
BitmapData dataDest = bitmapDest.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
int bitmapSize = data.Stride * data.Height;
Buffer.MemoryCopy(dataDest.Scan0, data.Scan0, bitmapSize, bitmapSize);
bitmap.UnlockBits(data);
bitmapDest.UnlockBits(dataDest);
return bitmapDest;
}
让我们使用这个函数将一个32位ARGB图像转换为24位RGB。我有以下几个问题:
- 锁定32位位图作为24位的工作原理是什么?为什么允许这样做?
- 现在,原始位图中每个像素的RGB分量是连续的吗?Alpha分量去哪了?步幅长度发生了什么变化?
- 将位图的位锁定为不同格式是否会在底层创建位图的副本?