1

別の画像のアルファを使用して画像のアルファを操作する方法はありますか?

Image があり、そのアルファを左から不透明に、右から完全に透明に変更したいとします。現在、LinearGradientBrush を使用して別の画像を描画し、ピクセルごとにループして 2 番目の画像から元の画像のアルファを設定します。Gdiplus に別の方法があります。 、いくつかの画像マスク、または 2 つの画像のアルファをブレンドしますか?

結論: GDI+ で 2 つの画像をブレンドする方法はないようです。唯一の方法は、ピクセルを反復処理する手動の方法のようです。

4

1 に答える 1

2

私はあなたがこのピクセルごとにやらなければならないという点であなたが正しいと思います。私はそれを行うためのより「純粋な」方法も探しましたが、これが私が最終的に得たものです:

    public enum ChannelARGB
    {
        Blue = 0,
        Green = 1,
        Red = 2,
        Alpha = 3
    }

    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 );
    }
于 2009-06-22T13:34:48.003 に答える