阅读jpg,编辑像素并保存而不会丢失

时间:2015-04-26 09:53:24

标签: c# image jpeg

我正在编写的程序可以加载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

1 个答案:

答案 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特定属性会导致参数错误。