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