【问题标题】:Merging 2 images using C#使用 C# 合并 2 个图像
【发布时间】:2014-12-16 19:13:05
【问题描述】:

我想在我的 C# 程序中合并两张图片。 第一个是灰度模式下的任何图片,第二个是这样的图片:

两张图片/图像的大小相同,这是我的代码:

Bitmap first = new Bitmap (picturebox1.image);
Bitmap second = new Bitmap (picturebox2.image);
Bitmap result = new Bitmap (first.width, first.height);
Graphics g = Graphics.FromImage(result);
g.DrawImageUnscaled(first, 0, 0);
g.Flush();
g.DrawImageUnscaled(second, 0, 0);
g.Flush();
picturebox3.image = result;

我可以加入那些图片,但结果的尺寸小于两张原件(两张图片的尺寸相同)。谁能给我一些建议?

此外,我希望结果图片具有这样的条件: 如果第 2 张图片的边缘像素在第 1 张图片中下降到亮侧,则会变暗,否则当边缘下降到暗侧时,它会变亮(看起来像发光)。 所以文本将是半透明的。

这是我想要的结果示例。

谁能给点建议?

【问题讨论】:

    标签: c# image-processing watermark


    【解决方案1】:

    是为了加入

    Bitmap first = new Bitmap (picturebox1.Image);
        Bitmap second = new Bitmap (picturebox2.Image);
        Bitmap result = new Bitmap (first.Width+first.Width, first.Height);
        Graphics g = Graphics.FromImage(result);
        g.DrawImageUnscaled(first, 0, 0);
        g.DrawImageUnscaled(second,first.Width, 0);
    

    试试这个合并一个在另一个之上。自己设置 alpha(红色:如果你不想要 alpha,你可以使用 BitMap.MakeTransParent)

            public Bitmap SetImageOpacity(Image image, float opacity)
            {
                try
                {
                    //create a Bitmap the size of the image provided  
                    Bitmap bmp = new Bitmap(image.Width, image.Height);
    
                    //create a graphics object from the image  
                    using (Graphics gfx = Graphics.FromImage(bmp))
                    {
    
                        //create a color matrix object  
                        ColorMatrix matrix = new ColorMatrix();
    
                        //set the opacity  
                        matrix.Matrix33 = opacity;
    
                        //create image attributes  
                        ImageAttributes attributes = new ImageAttributes();
    
                        //set the color(opacity) of the image  
                        attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
    
                        //now draw the image  
                        gfx.DrawImage(image, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes);
                    }
                    return bmp;
                }
                catch (Exception ex)
                {
    
                    return null;
                }
            } 
            private void button1_Click(object sender, EventArgs e)
            {
                Bitmap first = new Bitmap(pictureBox1.Image); 
                Bitmap second = SetImageOpacity(pictureBox2.Image, 0.5f);
                //Bitmap result = new Bitmap(first.Width, first.Height);
                //fix :
                Bitmap result = new Bitmap(Math.Max(first.Width,second.Width), Math.Max(first.Height,second.Height));
                Console.WriteLine(first.Width);
                Graphics g = Graphics.FromImage(result);
                g.DrawImageUnscaled(first, 0, 0);
                g.DrawImageUnscaled(second, 0, 0);
                pictureBox3.Image = result;
                result.Save("result.jpg" );
            }
        }
    }
    

    为了水印,为什么不使用带有 alpha 的 Drawstring 这是所有这些http://www.codeproject.com/Articles/5034/How-to-implement-Alpha-blending

    的文章

    【讨论】:

    • 第二张图片不是放在第一张旁边吗?
    • @user1442032 你想要什么?
    • @user1442032 看看是不是你想要的?
    • 我希望第二个在第一个之上
    • @user1442032 发布了该解决方案。检查
    【解决方案2】:

    您需要包含System.Drawing.Imaging 命名空间才能使此代码正常工作。

    执行以下代码:

    private void CombineImages(FileInfo[] files)
    {
        //change the location to store the final image.
        string finalImage = @"C:\\MyImages\\FinalImage.jpg";
        List imageHeights = new List();
        int nIndex = 0;
        int width = 0;
        foreach (FileInfo file in files)
        {
            Image img = Image.FromFile(file.FullName);
            imageHeights.Add(img.Height);
            width += img.Width;
            img.Dispose();
        }
        imageHeights.Sort();
        int height = imageHeights[imageHeights.Count - 1];
        Bitmap img3 = new Bitmap(width, height);
        Graphics g = Graphics.FromImage(img3);
        g.Clear(SystemColors.AppWorkspace);
        foreach (FileInfo file in files)
        {
            Image img = Image.FromFile(file.FullName);
            if (nIndex == 0)
            {
                g.DrawImage(img, new Point(0, 0));
                nIndex++;
                width = img.Width;
            }
            else
            {
                g.DrawImage(img, new Point(width, 0));
                width += img.Width;
            }
            img.Dispose();
        }
        g.Dispose();
        img3.Save(finalImage, System.Drawing.Imaging.ImageFormat.Jpeg);
        img3.Dispose();
        imageLocation.Image = Image.FromFile(finalImage);
    }
    

    点击链接:

    http://www.niteshluharuka.com/2012/08/combine-several-images-to-form-a-single-image-using-c/

    【讨论】:

    • 第二张图片不是放在第一张旁边吗?
    【解决方案3】:

    codeproject article 展示了如何使用文本以及其他图像为图像添加水印。

    总而言之,您要做的就是在具有所需透明度的图像上绘制水印图像。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-18
      • 2013-07-22
      • 2011-04-10
      • 1970-01-01
      • 2013-01-17
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多