2017-08-14 23 views
-1

私はbase64イメージを持っており、イメージに変換する必要があります。私はこのコードを使ってこれをやっています:C#Image to 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に変換する必要があります。イムこのコード使用:BASE64に再度画像を元base64Imageを変換した後

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); 
    } 

を、それがquality.TheオリジナルBASE64画像は長さが1676であり、変換後の長さ1660を有している失います。

私はそれを比較する必要があるので、私は変換後に同じ画像が必要です。どのように品質を失うことなくそれを行うためのアイデア?

+1

これらの16バイトが失われたのは、おそらく元のファイルに埋め込まれているだけです。イメージは同じに見えますか?別のイメージを使用してみてください。ファイルサイズはすべてのイメージで変更できますか? – Neil

+0

イメージは同じように見えますが、16バイトのためイメージを比較できません。この問題は、私がテストしたすべてのイメージで発生しました。 – lukhol

+0

これらの16バイトはほとんどデータではないので、画像が実際の品質を失うことはないようです(これは、使用されているエンコーディング/圧縮技術によって異なります) –

答えて

0

this pageによれば、PNGファイルはロスレスですが、保存するときに使用するファイル圧縮の量を指定できます。 IMOは、Imageが同じものになっている限り(何らかのMD5ツールを使ってそれらを比較することができます)、実際のイメージが同じであるため、ファイルのサイズが異なるかどうかは関係ありませんオリジナルとして。

+0

base64文字列を使用して、だから私は同じサイズの画像を持つ必要があります。 – lukhol

+0

ファイル全体のbase64を確認してイメージが同じであることを確認することは、単にイメージを比較することと同じではありません。 PNGファイルには、ファイル内のいくつかのメタデータで作成された日付があるとします。ファイルが保存されるたびに、少し異なりますが、イメージは同じです。 – Neil

+0

.Netのpngの処理は非常に最適化されておらず、そのファイルが他のアプリケーションで作成された場合、ほとんどの場合、読み込まれたファイルよりも大きな画像になります。また、技術的には.Netフレームワークの圧縮レベルプロパティで保存設定を指定することもできますが(jpegの場合と同じように)、この値は実際には完全に使用されません。 – 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

RawFormatを使用すると、結果のテキストはhsよりも大きくなります。これを比較のために使うこともできますが、 'SequenceEquals(...)'とバイトを単に比較する方がずっと効率的です。 – Nyerguds