コード例 #1
0
        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);
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
ファイル: MetaNodeItem.cs プロジェクト: revenz/iMeta
 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 );
 }