C# 将图像png格式读取为位图,并使用相同的哈希将其另存为png
我正在尝试将png文件导入为位图,并将其保存为同一类型(png),但哈希不相同 是否可以使用相同的文件保存位图以获得与以前相同的哈希值 我尝试的是:C# 将图像png格式读取为位图,并使用相同的哈希将其另存为png,c#,image,image-processing,C#,Image,Image Processing,我正在尝试将png文件导入为位图,并将其保存为同一类型(png),但哈希不相同 是否可以使用相同的文件保存位图以获得与以前相同的哈希值 我尝试的是: private static void VaryQualityLevel(string filename) { // Get a bitmap. Bitmap bmp1 = new Bitmap(filename); ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Png
private static void VaryQualityLevel(string filename)
{
// Get a bitmap.
Bitmap bmp1 = new Bitmap(filename);
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Png);
// Create an Encoder object based on the GUID
// for the Quality parameter category.
System.Drawing.Imaging.Encoder myEncoder =
System.Drawing.Imaging.Encoder.Quality;
// Create an EncoderParameters object.
// An EncoderParameters object has an array of EncoderParameter
// objects. In this case, there is only one
// EncoderParameter object in the array.
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);
myEncoderParameters.Param[0] = myEncoderParameter;
bmp1.Save(@"c:\TestPhotoQualityFifty.png", jpgEncoder, myEncoderParameters);
myEncoderParameter = new EncoderParameter(myEncoder, 100L);
myEncoderParameters.Param[0] = myEncoderParameter;
bmp1.Save(@"c:\TestPhotoQualityHundred.png", jpgEncoder, myEncoderParameters);
// Save the bitmap as a JPG file with zero quality level compression.
myEncoderParameter = new EncoderParameter(myEncoder, 0L);
myEncoderParameters.Param[0] = myEncoderParameter;
bmp1.Save(@"test5.png", jpgEncoder, myEncoderParameters);
}
private static ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
从根本上说,我不希望加载一个图像,然后再对其进行编码,从而得到完全相同的字节,这就是散列所依赖的。不同的编码器将有不同的实现——我可以想象这样的情况:即使编码语义等价信息的编码器也可以使用不同的字节输出。(在某些情况下,即使是同一个编码器也可以这样做,只要它包含时间戳、GUID或类似的东西。)
如果您需要与原始文件完全相同的字节,我会复制该文件。您正在使用不同的设置保存它,因此它将不一样。如果你想保持原样,为什么不直接复制原稿呢?我还强烈建议你避免像这样的误导性代码:
ImageCodecInfo-jpgEncoder=GetEncoder(ImageFormat.Png)
(为什么要将PNG图像保存为扩展名为.jpg的文件?)和//将位图保存为质量级别为零的jpg文件。
当您保存为PNG时。我的错误是,它必须是PNG。我将更改我的问题当然哈希不一样。Net框架没有特别好的png压缩。非常好。有一次,我不得不比较生成的PDF,最后编写了一个FileStream
子类,在对文件进行散列时,该子类去掉了GUID和时间戳。但是,对于比较图像,唯一真正可靠的方法是只比较像素数据。