C# 将图像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

我正在尝试将png文件导入为位图,并将其保存为同一类型(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和时间戳。但是,对于比较图像,唯一真正可靠的方法是只比较像素数据。