Es darf nur einen geben!

XChris

Erfahrenes Mitglied
Hallo,

habe nun lange zeit nix mehr programmiert ... und darf endlich mal wieder reinhauen.

Ich hab folgendes Problem: Eine Grafik wird in ein System übernommen. Dabei muss sichergestellt werden, dass die Grafik danach sich nie wieder verändert hat. Ich denke mir, mit dem Kopiervorgang müßte ich ein ein Attribute des Bildes so codieren können, dass ich es später immer wieder vergleichen könnte. Jemand eine Idee, wie ich dies Speicherschohnend und schnell mache?

Chris
 
Verwende doch ein Hash-Verfahren ala MD5 oder SHA1, du erstellst dabei einen Hash der nicht veränderlichen Eigenschaften bzw. des ganzen Bildes. Später kannst du diesen gespeicherten Hash mit einem aktuell erstellten vergleichen, so siehst du gleich, ob es eine Änderung gegeben hat.


Der Doc!
 
Hash-Codes bieten nur die Möglichkeit für einen Plausibilitätstest, und eine gute Hashfunktion zu erstellen kann schwierig werden. Um sicherzustellen, dass die Grafik nicht verändert wird, ist es einfacher und besser, den Zugriff zu kapseln. Du erstellst dann eine Art Adapter-Klasse, welche das Bild einliest und bei Bedarf zur Verfügung stellt. Dabei lieferst du nicht das Bild selber zurück, sondern bietest Methoden an, welche die gewünschte bzw. erlaubte Funktionalität anbieten. Denkbar ist beispielsweise eine paint-Methode für Komponenten.
 
Hi,

hab nun gedacht, dass ich es so lösen kann:

Code:
public void LoadPic(FileInfo fileInfo)
		{
			FileStream fs = new FileStream(fileInfo.FullName, FileMode.Open,FileAccess.Read);
			byte[] imageData = new byte[fs.Length];
			
			fs.Read(ImageData,0,System.Convert.ToInt32(fs.Length));
			
			fs.Close();
			
			string test = ImageData.GetHashCode().ToString();

               }

Jedoch erhält test immer wieder neue Werte. Dabei hoffte ich, mit GetHashCode einen eindeutigen "Fingerprint" zu erhalten. Was läuft hier nur schief?

- UPDATE -
In FileInfo ist nur ein Verweis zu einer Bilddatei mit 6 megapixel.

Chris

PS. Exceptionhandling etc. kommt noch. Hab den Code reduziert, damit nur das Problem sichtbar wird.
 
Zuletzt bearbeitet:
Ich möchte lösen:

Code:
private string hashImage(string filename)
		{
			FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read);
			byte[] imageData = new byte[fs.Length];			
			fs.Read(imageData,0,System.Convert.ToInt32(fs.Length));			
			fs.Close();			
			string test;		
			
			System.Text.Encoding enc = System.Text.Encoding.UTF32;
			
			test = enc.GetString(imageData);
			test = getMD5(test.ToCharArray());
			return test;
		}		
		
		private string getMD5(char[] input)
		{
			System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] bs = System.Text.Encoding.UTF8.GetBytes(input);
            bs = x.ComputeHash(bs);
            System.Text.StringBuilder s = new System.Text.StringBuilder();
            foreach (byte b in bs)
            {
                s.Append(b.ToString("x2").ToLower());
            }
            string password = s.ToString();
            return password;
		}

Chris

PS: Danke an Mahdi für die Schützenhilfe.
 
Zurück