首页 > 解决方案 > 在.Net中,将“图像”与另一张图像转换时,会影响其中一张图像的颜色质量

问题描述

在 .net 应用程序中,当图像被处理并与另一个图像合并时,它的颜色会受到影响。图片图片 ---------> 上传图片

位图 xy = new Bitmap(image, image.Width, image.Height); -----> 转换为位图以执行各种操作,例如调整大小或与另一个图像合并。

所以“图像”对象有很少的“属性项”,当我们将图像转换为位图类型的对象时,这些“属性项”数组是空的,这意味着这些“属性项”在此转换中没有移动。

带有属性项的图像

现在将此图像移动到位图对象以与另一个图像合并后,“PropertyItems”数组为空

没有属性项的位图图像

由于这些属性项的丢失,图像的颜色发生了变化。

对于合并,我使用下面的代码

public string MergeImages(List<BlockPositionDetailsWithSize> blockPositionDetailsWithSize, int layoutWidth, int layoutHeight)
    {
        var bitmap = new Bitmap(layoutWidth-75, layoutHeight);
        float width = 0, height = 0;
        using (var g = Graphics.FromImage(bitmap))
        {
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.PixelOffsetMode = PixelOffsetMode.HighQuality;
            g.CompositingQuality = CompositingQuality.HighQuality;

            var bitmapImg = blockPositionDetailsWithSize.Where(b => b.BlockId.Contains("fImageBlock")).FirstOrDefault();

           // This loop is placing two images in graphic object
            foreach (var block in blockPositionDetailsWithSize)
            {
                width = block.Width;
                height = block.Height;                    
                g.DrawImage(block.BlockImage, block.PosX, block.PosY, block.Width, block.Height);
            }

        }

        ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg); // change image format 

        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        bitmap.SetResolution(288, 288);

        System.Drawing.Imaging.Encoder imgEncoder = System.Drawing.Imaging.Encoder.Quality;
        EncoderParameters imgEncoderParameters = new EncoderParameters(1);

        EncoderParameter imgEncoderParameter = new EncoderParameter(imgEncoder, 95L); //A quality level of 0 corresponds to the greatest compression, and a quality level of 100 corresponds to the least compression.
        imgEncoderParameters.Param[0] = imgEncoderParameter;

        bitmap.Save(ms, jpgEncoder, imgEncoderParameters);


        byte[] byteImage = ms.ToArray();

        string base64String = string.Empty;
        base64String = Convert.ToBase64String(byteImage); ////Get Base64

        return base64String;
    }

图像的颜色质量可以通过以下代码保持

foreach (System.Drawing.Imaging.PropertyItem item in bitmapImg.BlockImage.PropertyItems)
                {
                    try
                    {
                        bitmap.SetPropertyItem(item);
                    }
                    catch
                    {

                    }
                }

现在的问题是我无法在最终图像上应用一个图像的属性项(合并后生成)。因为当我将一个图像的属性项应用到另一个图像上时,第二个图像的颜色质量会受到影响,但如果我不应用,那么第一个图像的颜色质量就会受到影响。

所以我正在寻找在不丢失任何属性项目的情况下合并两个图像的方法。

标签: c#.netimage-processing

解决方案


推荐阅读