我正在编写的程序可以加载JPG
文件,并将像素0,0
颜色编辑为red
并保存JPG而不会丢失。有可能吗?
我的程序在PropertyItem propItem = image1.GetPropertyItem(20624);
行上获得异常,我不知道原因。
错误是:
System.Drawing.dll中出现未处理的“System.ArgumentException”类型异常
代码
Image image1 = Image.FromFile("1789594.jpg");
Bitmap bitmap1 = new Bitmap(image1);
bitmap1.GetPixel(0, 0);
Color pixelColor = bitmap1.GetPixel(0, 0);
Console.WriteLine(pixelColor.R + " - " + pixelColor.G + " - " + pixelColor.B);
Console.ReadLine();
Color redColor = Color.FromArgb(255, 0, 0);
bitmap1.SetPixel(0, 0, redColor);
image1 = (Image)bitmap1;
// Get a PropertyItem from image1. Because PropertyItem does not
// have public constructor, you first need to get existing PropertyItem
PropertyItem propItem = image1.GetPropertyItem(20624);
// Change the ID of the PropertyItem.
propItem.Id = 20625;
// Set the new PropertyItem for image1.
image1.SetPropertyItem(propItem);
// Save the image.
image1.Save("outputcsharp.jpeg", ImageFormat.Jpeg); //jpg
答案 0 :(得分:2)
我将从JPEG角度回答这个问题,而不是C#。无法编辑JPEG中的像素并保存而不会丢失。
JPEG过程有几个引入损失的步骤。
您可以最小化更改 1)使用相同的采样;和 2)相同的量化表 与在原始源文件中一样。
JPEG中的一个变化是它在压缩之前转换为YCbCr颜色空间。 RGB和YCbCr之间没有一对一的映射。因此,您可以设置RGB像素值,压缩,扩展,并发现它们与该转换的显着不同。
我对C#一无所知,但在文档中,PropertyID 20624是亮度量化表。 看起来你的代码试图使色度量化表成为可能。
即使你取得了成绩,这也可能产生奇怪的效果。
我回来加上这个C#guess ---
Bitmap bitmap1 = new Bitmap(image1);
C#可能认为image1是JPEG,而bitmap1不是JPEG。因此,尝试从非JPEG图像检索JPEG特定属性会导致参数错误。