سؤال

هل هناك طريقة للتلاعب ألفا من صورة باستخدام ألفا من صورة أخرى؟

لنفترض لدي صورة وأنا أريد أن يغير ألفا التي تبدأ مبهمة في اليسار وشفافة تماما في الحق، وحاليا أود أن ألفت صورة أخرى مع LinearGradientBrush ومجموعة ألفا من الصورة الاصليه من الصورة الثانية بواسطة حلقات بكسل بكسل، هناك آخر الطريقة Gdiplus، وبعض قناع صورة، أو ألفا مزج اثنين من الصور؟

والخلاصة: على ما يبدو ليس هناك أي وسيلة في GDI + لمزج صورتين، سوى طريقة ويبدو أن الطريقة اليدوية التي بالتكرار من خلال بكسل

هل كانت مفيدة؟

المحلول

وأعتقد أنك الصحيح في أن لديك للقيام بذلك بكسل حسب بكسل. لقد فتشت أيضا لمزيد من طريقة "نقية" للقيام بذلك، ولكن هذا هو ما انتهى بي الأمر مع:

    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 );
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top