将图像png格式读取为位图并将其保存为具有相同散列的png

时间:2018-04-01 13:59:25

标签: c# image image-processing

我尝试将png文件导入为Bitmap并将其保存为相同类型(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;
}

1 个答案:

答案 0 :(得分:1)

从根本上说,我不希望加载图像然后再次对其进行编码以产生完全相同的字节,这是您的哈希所依赖的。不同的编码器将有不同的实现 - 我可以想象甚至编码语义等效信息的编码器可以使用不同的字节输出这样做的情况。 (在某些情况下,即使相同的编码器也可以这样做,如果它包含时间戳或GUID或类似的东西。)

如果您需要与原始文件完全相同的字节,我只需复制该文件。