C# 在.Net中,在转换“时”;“图像”;使用另一个图像,然后使用其中一个图像';颜色质量受到影响

C# 在.Net中,在转换“时”;“图像”;使用另一个图像,然后使用其中一个图像';颜色质量受到影响,c#,.net,image-processing,C#,.net,Image Processing,在.net应用程序中,当图像被处理并与另一图像合并时,其颜色会受到影响。 图像----------->上传图像 位图xy=新位图(图像、图像.宽度、图像.高度);------>转换为位图以执行各种操作,如调整大小或与其他图像合并 所以“图像”对象几乎没有“属性项”,当我们将图像转换为位图类型的对象时,这些“属性项”数组是空的,这意味着这些“属性项”在此转换中没有移动 现在,在将该图像移动到位图对象以与另一个图像合并后,“PropertyItems”数组为空 由于这些属性项的丢失,图像的颜色发

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

位图xy=新位图(图像、图像.宽度、图像.高度);------>转换为位图以执行各种操作,如调整大小或与其他图像合并

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

现在,在将该图像移动到位图对象以与另一个图像合并后,“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;
    }
现在的问题是,我无法将一个图像的属性项应用于最终图像(合并后生成)。因为当我将一个图像的属性项应用到另一个图像上时,第二个图像的颜色质量会受到影响,但如果我不应用,则第一个图像的颜色质量会受到影响


因此,我正在寻找一种在不丢失任何属性项的情况下合并两个图像的方法。

如果要创建与原始图像相同的新位图,
.Clone()
原始图像(
var Bitmap=(Bitmap)[original].Clone();
)。如果执行类似于
var bitmap=new bitmap([original])
的操作,您将丢失
PropertyIdList
。如果合并一组图像,无论如何都会丢失
PropertyItems
,因为新位图可以有一个
PropertyIdList
作为所有其他位图的总和是没有任何意义的。合并的位图必须具有
PixelFormat=PixelFormat.Format32bppArgb
。如果从文件或流加载原始图像,请使用格式
var Image=Image.FromFile(@“[file Path]”),true)。注意
true
参数,看看这是什么意思。@Jimi谢谢你的评论。但我面临一个奇怪的问题,我的客户有佳能数码单反拍摄的图像,当图像转换成位图时,它的颜色质量会受到影响,但我尝试了许多其他数码单反拍摄的图像,但没有遇到这个问题。这些特定图像可能有什么问题?对此有什么想法吗?如果不测试图像并将其与原始原始格式进行比较,很难说。大多数情况下,因为图像中存储的ICM/ICC配置文件尚未加载(如果它在从原始格式转换时已实际保存在图像中),正如我之前的评论所暗示的。有时会发生这种情况,因为JPG转换(JPG应仅用于预览/文件共享)是在颜色管理不同的另一个平台(例如MacOS)中执行的。DSLR的低通滤波器可能存储需要系统特定解释的信息。专业软件可以填补平台之间的空白,正确解释ICM配置文件并执行自适应。单靠GDI+是不行的。但这只是猜测。如果要创建与原始位图相同的新位图,
.Clone()
原始位图(
var Bitmap=(Bitmap)[original].Clone();
)。如果执行类似于
var bitmap=new bitmap([original])
的操作,您将丢失
PropertyIdList
。如果合并一组图像,无论如何都会丢失
PropertyItems
,因为新位图可以有一个
PropertyIdList
作为所有其他位图的总和是没有任何意义的。合并的位图必须具有
PixelFormat=PixelFormat.Format32bppArgb
。如果从文件或流加载原始图像,请使用格式
var Image=Image.FromFile(@“[file Path]”),true)。注意
true
参数,看看这是什么意思。@Jimi谢谢你的评论。但我面临一个奇怪的问题,我的客户有佳能数码单反拍摄的图像,当图像转换成位图时,它的颜色质量会受到影响,但我尝试了许多其他数码单反拍摄的图像,但没有遇到这个问题。这些特定图像可能有什么问题?对此有什么想法吗?如果不测试图像并将其与原始原始格式进行比较,很难说。大多数情况下,因为图像中存储的ICM/ICC配置文件尚未加载(如果它在从原始格式转换时已实际保存在图像中),正如我之前的评论所暗示的。有时会发生这种情况,因为JPG转换(JPG应仅用于预览/文件共享)是在颜色管理不同的另一个平台(例如MacOS)中执行的。DSLR的低通滤波器可能存储需要系统特定解释的信息。专业软件可以填补平台之间的空白,正确解释ICM配置文件并执行自适应。单靠GDI+是不行的。但这只是猜测。
foreach (System.Drawing.Imaging.PropertyItem item in bitmapImg.BlockImage.PropertyItems)
                {
                    try
                    {
                        bitmap.SetPropertyItem(item);
                    }
                    catch
                    {

                    }
                }