2010-08-04 7 views
6

Benötigen Sie MD5-Hash für ein in Speicher System.Drawing.ImageBenötigen Sie MD5-Hash für einen im Speicher System.Drawing.Image

+0

Wo stecken Sie fest? Es ist relativ einfach. –

+1

Der Titel * sagt nicht alles ... warum brauchst du einen Hash? Muss es mit dem Hash einer entsprechenden Datei auf der Festplatte identisch sein? Vermutlich werden Sie den Hash irgendwann mit etwas vergleichen ... – JaredReisinger

+0

@Jared - http://uploadscreenshot.com/api-documentation#variables Jetzt wissen Sie, was ich weiß: Ich habe ein System.Drawing .Image im Speicher und müssen einen MD5-Hash des Image-Objekts an diese API senden. –

Antwort

5

Hier ist ein einfaches Snippet. Siehe auch @ JaredReisingers Kommentar für einige Fragen.

using System.Security.Cryptography; 
using System.Text; 
using System.Drawing.Imaging; 
// ... 

// get the bytes from the image 
byte[] bytes = null; 
using(MemoryStream ms = new MemoryStream()) 
{ 
    image.Save(ms,ImageFormat.Gif); // gif for example 
    bytes = ms.ToArray(); 
} 

// hash the bytes 
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); 
byte[] hash = md5.ComputeHash(bytes); 

// make a hex string of the hash for display or whatever 
StringBuilder sb = new StringBuilder(); 
foreach (byte b in hash) 
{ 
    sb.Append(b.ToString("x2").ToLower()); 
} 
+0

Sollte das nicht 'foreach (Byte b in Hash) 'lesen? –

+0

oops, danke :) –

+1

Danke, dass du nur die Frage beantwortet hast und nicht all deine Energie ausgegeben hast, die dir Sorgen macht, warum ich es wissen muss. Ich wünschte, mehr Menschen in SO wären mehr wie du. Außerdem können Sie die StringBuilder- und foreach-Schleife vermeiden. Siehe meine Antwort. –

2

Eine einfache Probe, basierend auf der sample in MSDN; Beachten Sie, dass dieser Hash von der internen Darstellung des Bildes abhängt und nicht mit dem aus einer Datei erzeugten Hash übereinstimmt.

using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 
using System.Security.Cryptography; 
using System.Text; 

class Program 
{ 
    static string getMd5Hash(byte[] buffer) 
    { 
     MD5 md5Hasher = MD5.Create(); 

     byte[] data = md5Hasher.ComputeHash(buffer); 

     StringBuilder sBuilder = new StringBuilder(); 
     for (int i = 0; i < data.Length; i++) 
     { 
      sBuilder.Append(data[i].ToString("x2")); 
     } 
     return sBuilder.ToString(); 
    } 

    static byte[] imageToByteArray(Image image) 
    { 
     MemoryStream ms = new MemoryStream(); 
     image.Save(ms, ImageFormat.Bmp); 
     return ms.ToArray(); 
    } 

    static void Main(string[] args) 
    { 
     Image image = Image.FromFile(@"C:\tmp\Jellyfish.jpg"); 
     byte[] buffer = imageToByteArray(image); 
     string md5 = getMd5Hash(buffer); 
    } 
} 

Um die MD5 Klasse Sie einen Verweis auf System.Security hinzufügen müssen verwenden.

Je nachdem, was Sie verwenden werden, sollte der Hash für Sie die Tatsache berücksichtigen, dass MD5 nicht mehr Stand der Technik ist und dass es bessere Hash-Funktionen gibt, wenn Sie einen starken Hash benötigen.

+0

Ich muss sagen, das ist schön zusammengefügt .... auf que mit was die Lehrbücher auch für Prüfungsteilnehmer lehren. – IbrarMumtaz

1

Dank an die anderen Kollegen, die geantwortet haben. Hier ist, was ich am Ende getan habe:

MemoryStream ms = new MemoryStream() 
image.Save(ms, ImageFormat.Png); 
byte[] imgBytes = ms.ToArray(); 

MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); 
byte[] hash = md5.ComputeHash(imgBytes); 
string imageMD5 = BitConverter.ToString(hash).Replace("-", "").ToLower(); 
ms.Dispose(); 
Verwandte Themen