2017-08-14 73 views
-1

我有一个base64图像,我必须将其转换成图像。我这样做使用此代码:C#图像base64

public static Image ConvertBase64StringToImage(string imageBase64String) 
{ 
    var imageBytes = Convert.FromBase64String(imageBase64String); 
    var imageStream = new MemoryStream(imageBytes, 0, imageBytes.Length); 
    imageStream.Write(imageBytes, 0, imageBytes.Length); 
    var image = Image.FromStream(imageStream, true); 
    return image; 
} 

然后我必须将此图像转换为base64再次。使用im此代码:

public static string ConvertImageToBase64String(Image image) 
    { 
     var imageStream = new MemoryStream(); 
     image.Save(imageStream, ImageFormat.Png); 
     imageStream.Position = 0; 
     var imageBytes = imageStream.ToArray(); 
     return Convert.ToBase64String(imageBytes); 
    } 

原始base64Image转换成图像,并再次为base64后,它失去quality.The原始的base64图像的长度为1676和转换后它的长度具有1660。

转换后我需要相同的图像,因为我必须对它进行比较。任何想法如何做到不失质量?

+1

这16个字节丢失可能只是原始文件中的填充。图像看起来是否一样?尝试使用不同的图像,所有图像上的文件大小是否更改,或者只有那一个。 – Neil

+0

图像看起来相同,但由于这16个字节,我无法比较这些图像。这个问题发生在我测试的每个图像上。 – lukhol

+0

这16个字节是如此少的数据,似乎不太可能的图像失去了实际的质量(也取决于所使用的编码/压缩技术) –

回答

0

根据this page虽然PNG文件是无损的,但您可以指定在存储时要使用多少文件压缩。国际海事组织,只要Image出来相同(你可以使用某种类型的MD5工具比较它们),保存它时文件的大小是不同的,因为实际的图像仍然是相同的作为原件。

+0

我必须检查这个图像使用base64字符串,所以我需要有相同大小的图像。 – lukhol

+0

检查整个文件的base64以确认图像是否相同与仅比较图像不同。设想一下,PNG文件在文件中的某些元数据中创建了它的创建日期。每次保存文件时,它都略有不同,但图像是相同的。 – Neil

+0

.Net的png处理非常没有优化,并且如果该文件是使用其他应用程序创建的,则几乎总是会导致比加载的文件更大的图像。此外,虽然技术上可以在.Net框架中指定具有压缩级别属性的保存设置(就像它为jpeg所做的那样),但实际上该值完全没有使用。虽然使用'RawFormat'的 – Nyerguds

0

这是如何转换和比较您的图片,如果CompareImages的结果为零,则表示它们相等或非常相似。

static void Main(string[] args) 
    { 
     Image img = new Bitmap("Koala.jpg"); 
     string img64Bit = ConvertImageToBase64String(img); 
     Image newImg = ConvertBase64StringToImage(img64Bit); 
     newImg.Save("KoalaCopy.jpg"); 
     Console.WriteLine(CompareImages(img, newImg)); 
     Console.ReadLine(); 
    } 

    public static string ConvertImageToBase64String(Image image) 
    { 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      image.Save(ms, image.RawFormat); 
      return Convert.ToBase64String(ms.ToArray()); 
     } 
    } 

    public static Image ConvertBase64StringToImage(string image64Bit) 
    { 
     byte[] imageBytes = Convert.FromBase64String(image64Bit);    
     return new Bitmap(new MemoryStream(imageBytes)); 
    } 

    public static int CompareImages(Image i1, Image i2) 
    { 
     string img1 = ConvertImageToBase64String(i1); 
     string img2 = ConvertImageToBase64String(i2); 
     return String.Compare(img1, img2); 
    } 
+0

将使得生成的文本比它大得多。你可以使用它进行比较,但是比较字节和'SequenceEquals(...)'的效率更高。 – Nyerguds