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

C# 阅读jpg,编辑像素并保存而不丢失,c#,image,jpeg,C#,Image,Jpeg,我正在编写程序,可以加载JPG文件,编辑像素0,0颜色到red并保存JPG而不丢失。有可能吗 我的程序在PropertyItem proItem=image1.GetPropertyItem(20624)行上获得异常,我不知道为什么 错误是: System.Drawing.dll中发生类型为“System.ArgumentException”的未处理异常 代码 我将从JPEG的角度来回答这个问题,而不是C。无法在JPEG中编辑像素并保存而不丢失 JPEG过程有几个步骤会导致丢失 您可以通过以下方

我正在编写程序,可以加载
JPG
文件,编辑像素
0,0
颜色到
red
并保存JPG而不丢失。有可能吗

我的程序在
PropertyItem proItem=image1.GetPropertyItem(20624)行上获得异常,我不知道为什么

错误是:

System.Drawing.dll中发生类型为“System.ArgumentException”的未处理异常

代码


我将从JPEG的角度来回答这个问题,而不是C。无法在JPEG中编辑像素并保存而不丢失

JPEG过程有几个步骤会导致丢失

您可以通过以下方式最小化更改: 1) 采用相同的抽样方法;和 2) 相同的量化表 与原始源文件中相同

JPEG中的一个变化是它在压缩之前转换为YCbCr颜色空间。RGB和YCbCr之间没有1对1映射。因此,您可以设置RGB像素值,压缩、扩展并发现它们与该变换有显著的不同

我对C#一无所知,但在文档PropertyID 20624中是亮度量化表。 看起来您的代码正在尝试将其作为色度量化表

这可能会产生奇怪的效果,即使你达到了你的目标

我回来加上这个C#guess---


C#可能认为image1是JPEG,而bitmap1不是JPEG。因此,尝试从非JPEG图像检索JPEG特定属性会导致参数错误。

由于jpg是有损压缩,因此“保存jpg”和“不丢失”几乎是互斥的,并且您将始终生成瑕疵。尝试使用PNG或TIFF。但是,与您的异常无关。请在不丢失的情况下清楚地保存JPG。如果您对JPG使用标准类,则无法获得此结果。您可能必须“手动”修改JPG:加载、修改并重新保存。这样,只有宏块的质量才会降低。您可以控制保存的jpeg的质量。当你真的只需要3行代码时,这些代码行在yopur代码中做什么???(
Bitmap image1=(Bitmap)Image.FromFile(“1789594.jpg”);image1.SetPixel(x,y,Color.FromArgb(255255,0,0);image1.Save(…)
有什么具体的原因可以解释为什么你要用如此复杂的方式而不是TaW建议的方式来改变颜色吗?隐写术和jpg不能很好地结合在一起。如果你坚持这样做,你要么:必须借助xanatos的adivce,在库的帮助下处理原始jpeg数据,要么你可以成功地添加一个检查看看重要的像素是否真的保存了下来。使用jpg不那么显眼,但比使用png困难得多!
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
Bitmap bitmap1 = new Bitmap(image1);