private static void TransferARGBChannel( Bitmap source, Bitmap dest, ChannelARGB sourceChannel, ChannelARGB destChannel) { if (source.Size != dest.Size) { throw new ArgumentException(); } Rectangle r = new Rectangle(Point.Empty, source.Size); BitmapData bdSrc = source.LockBits(r, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); BitmapData bdDst = dest.LockBits(r, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); unsafe { byte *bpSrc = (byte *)bdSrc.Scan0.ToPointer(); byte *bpDst = (byte *)bdDst.Scan0.ToPointer(); bpSrc += (int)sourceChannel; bpDst += (int)destChannel; for (int i = r.Height * r.Width; i > 0; i--) { *bpDst = *bpSrc; bpSrc += 4; bpDst += 4; } } source.UnlockBits(bdSrc); dest.UnlockBits(bdDst); }
private void TransferChannel(Bitmap srcBitmap, ChannelARGB srcChannel, Bitmap dstBitmap, ChannelARGB dstChannel) { var srcData = srcBitmap.LockBits(new Rectangle(0, 0, srcBitmap.Width, srcBitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); try { var dstData = dstBitmap.LockBits(new Rectangle(0, 0, dstBitmap.Width, dstBitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); try { var ret = TransferChannel32(srcData.Scan0, (int)srcChannel, srcData.Stride, dstData.Scan0, (int)dstChannel, dstData.Stride, srcBitmap.Width, srcBitmap.Height); if (ret != 0) { Log.Write(LogLevel.Error, "Error when transferring bitmap channel: {0}", ret); } } finally { dstBitmap.UnlockBits(dstData); } } finally { srcBitmap.UnlockBits(srcData); } }
public static void transferOneARGBChannelFromOneBitmapToAnother(Bitmap source, Bitmap dest, ChannelARGB sourceChannel, ChannelARGB destChannel ) { if ( source.Size!=dest.Size ) throw new ArgumentException(); Rectangle r = new Rectangle( Point.Empty, source.Size ); BitmapData bdSrc = source.LockBits( r, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb ); BitmapData bdDst = dest.LockBits( r, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb ); unsafe { byte* bpSrc = (byte*)bdSrc.Scan0.ToPointer(); byte* bpDst = (byte*)bdDst.Scan0.ToPointer(); bpSrc += (int)sourceChannel; bpDst += (int)destChannel; for ( int i = r.Height * r.Width; i > 0; i-- ) { *bpDst = *bpSrc; bpSrc += 4; bpDst += 4; } } source.UnlockBits( bdSrc ); dest.UnlockBits( bdDst ); }