2013-04-25 5 views
6

Ich habe eine Klasse, die ein Image aus einem Byte[] zusammen mit einer anderen Logik erstellt, und ich versuche, einen Komponententest zu schreiben, der besagt, dass die Image Instanz von meiner Klasse zurückgegeben wird gleiche wie einige falsche Image Ich habe in meiner Einheit Test.Vergleichen von Bildern als Byte-Arrays für Komponententests

Ich kann nicht eine zuverlässige Art und Weise finden:

  • Starten mit einem gefälschten Image \ Byte[] \ Resource \ etwas.
  • Übergeben Sie eine Byte[], die die falsche Sache zu meiner Klasse darstellt.
  • Assert die Image zurückgegeben von meiner Klasse ist das gleiche wie meine falsche Sache.

Hier ist der Code, den ich mit so weit gekommen sind:

Bitmap fakeBitmap = new Bitmap(1, 1); 

Byte[] expectedBytes; 
using (var ms = new MemoryStream()) 
{ 
    fakeBitmap.Save(ms, ImageFormat.Png); 
    expectedBytes = ms.ToArray(); 
} 

//This is where the call to class goes 
Image actualImage; 
using (var ms = new MemoryStream(expectedBytes)) 
    actualImage = Image.FromStream(ms); 

Byte[] actualBytes; 
using (var ms = new MemoryStream()) 
{ 
    actualImage.Save(ms, ImageFormat.Png); 
    actualBytes = ms.ToArray(); 
} 

var areEqual = 
    Enumerable.SequenceEqual(expectedBytes, actualBytes); 

Console.WriteLine(areEqual); 

var desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 

using(StreamWriter sw = new StreamWriter(Path.Combine(desktop, "expectedBytes.txt"))) 
    sw.Write(String.Join(Environment.NewLine, expectedBytes)); 


using(StreamWriter sw = new StreamWriter(Path.Combine(desktop, "actualBytes.txt"))) 
    sw.Write(String.Join(Environment.NewLine, actualBytes)); 

Diese immer false zurückgibt.

Antwort

0

Ich kann mir vorstellen, dass Image.Save auch die Metadaten im Bild aktualisiert und das Datum/die Uhrzeit dieses Bildes ändert, wodurch sich Ihr Byte-Array ändert.

1

Versuchen Sie folgendes:

public static class Ext 
{ 
    public static byte[] GetBytes(this Bitmap bitmap) 
    { 
     var bytes = new byte[bitmap.Height * bitmap.Width * 3]; 
     BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), 
               ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 

     Marshal.Copy(bitmapData.Scan0, bytes, 0, bytes.Length); 
     bitmap.UnlockBits(bitmapData); 
     return bytes; 
    } 
} 
var bitmap = new Bitmap(@"C:\myimg.jpg"); 
var bitmap1 = new Bitmap(@"C:\myimg.jpg"); 


var bytes = bitmap.GetBytes(); 
var bytes1 = bitmap1.GetBytes(); 
//true 
var sequenceEqual = bytes.SequenceEqual(bytes1); 
+0

Mit 'GetBytes (fakeBitmap)' gibt ein 3-Byte-Array voller Zeros. Wenn Sie das an Image.FromStream() übergeben, wird eine ArgumentException ausgelöst. – DaveShaw

+0

Weil Sie die Raw-Bytes 'Image' erhalten, kann nicht mit Raw-Bytes arbeiten. Wenn Sie diese Methode 'fakeBitmap.Save (ms, ImageFormat.Png);' verwenden, erhalten Sie Bytes im angegebenen Format. –

Verwandte Themen