Наложение изображения поверх другого изображения - C#

Узнай цену своей работы

Формулировка задачи:

Дорогие!Подскажите пожалуйста, как реализовать следующую задачу: необходимо наложить одно изображение поверх другого изображения, без применения альфаканала, то есть на одном изображении допустим есть "некто" сфотографированный на произвольного цвета фоне, необходимо наложить на этого "некто" произвольный фон(любая картинка).Я реализовал, правда только при условии что фон, на котором фотографируется этот "некто", будет только черным, а вот как сделать чтобы он был произвольного цвета, не могу придумать, подскажите плиз!
Bitmap lico = new Bitmap(pictureBox2.Image, pictureBox2.Image.Size.Width, pictureBox2.Image.Size.Height);
            
            OpenFileDialog openfon = new OpenFileDialog();
            openfon.InitialDirectory = "C:\\Program Files";
            openfon.Filter = "Bitmap files (*.bmp)|*.bmp|Jpeg files (*.jpg)|*.jpg|All files (*.*)|*.*";
            openfon.FilterIndex = 2;
            openfon.Title = "Выбрать картинку для фона";
            if (openfon.ShowDialog() == DialogResult.OK)
            {
                fon = (Bitmap)Bitmap.FromFile(openfon.FileName, false);
                Refresh();
            }
            else { fon = new Bitmap(@"C:\Program Files\MiMushi_Company\Web_Camera\j2.jpg"); }
 
            for (int x = 0; x < lico.Width; x++)
                for (int y = 0; y < lico.Height; y++)
                {
                    Color color1 = lico.GetPixel(x, y);
                    Color color2 = fon.GetPixel(x,y);
                    if(color1.R<50 ){lico.SetPixel(x,y,color2);}//здесь я определяю, что фон черного цвета, а 
                                                                   //надо любого произвольного, на котором он фоткается
                    else { lico.SetPixel(x, y, color1); }
                 }

Решение задачи: «Наложение изображения поверх другого изображения»

textual
Листинг программы
        /// <summary>
        /// Наложение 2х изображений друг на друга.
        /// </summary>
        /// <param name="x">1е изображение.</param>
        /// <param name="y">2е изображение.</param>
        /// <returns></returns>
        unsafe Bitmap AlphaBlendingUnsafe(Bitmap x, Bitmap y, byte s) {
            if (x == null || y == null)
                throw new NullReferenceException();
 
            if (x.PixelFormat != PixelFormat.Format24bppRgb ||
                y.PixelFormat != PixelFormat.Format24bppRgb)
 
                throw new ArgumentException();
 
            var rect = new Rectangle(0, 0, Math.Min(x.Width, y.Width), Math.Min(x.Height, y.Height));
 
            Bitmap bmp = new Bitmap(
                rect.Width,
                rect.Height,
                PixelFormat.Format24bppRgb
                );
 
            var bd = bmp.LockBits(rect, ImageLockMode.WriteOnly, bmp.PixelFormat);
            var bd0 = x.LockBits(rect, ImageLockMode.ReadOnly, x.PixelFormat);
            var bd1 = y.LockBits(rect, ImageLockMode.ReadOnly, y.PixelFormat);
 
            byte* pBmp = (byte*)bd.Scan0;
            byte* pX   = (byte*)bd0.Scan0;
            byte* pY   = (byte*)bd1.Scan0;
 
            byte* pEnd = pBmp + bd.Stride * bd.Height;
 
            while (pBmp != pEnd) {
                *pBmp = (byte)(*pX * (255 - s) / 255 + *pY * s / 255);
                *(pBmp + 1) = (byte)(*(pX + 1) * (255 - s) / 255 + *(pY + 1) * s / 255);
                *(pBmp + 2) = (byte)(*(pX + 2) * (255 - s) / 255 + *(pY + 2) * s / 255);
 
                pBmp += 3;
                pX += 3;
                pY += 3;
            }
 
            bmp.UnlockBits(bd);
            x.UnlockBits(bd0);
            y.UnlockBits(bd1);
            return bmp;
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5
Похожие ответы