2013-04-25 10 views
6

Mam klasę, która tworzy Image z Byte[], wraz z inną logiką, i próbuję napisać test jednostki, który zapewnia, że ​​instancja Image zwrócona z mojej klasy jest tak samo jak niektóre fałszywe Image Mam w moim test jednostkowy.Porównywanie obrazów jako tablic bajtowych dla testów jednostkowych

nie mogę znaleźć niezawodny sposób:

  • Uruchom z fałszywą Image \ Byte[] \ Resource \ coś.
  • Przekaż Byte[] reprezentującą fałszywą rzecz do mojej klasy.
  • Potwierdzenie, że Image wrócił z mojej klasy, jest taki sam jak mój fałszywy rzecz.

Oto kod mam wymyślić do tej pory:

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

To zawsze wraca false.

Odpowiedz

0

Mogę sobie wyobrazić, że Image.Save również aktualizuje metadane wewnątrz obrazu, modyfikując datę/czas obrazu, który zmieni tablicę bajtów.

1

Spróbuj tego:

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

Użycie 'getBytes (fakeBitmap)' zwraca tablicę 3 bajtowy pełną zer. Przechodząc do 'Image.FromStream()' zgłasza 'ArgumentException'. – DaveShaw

+0

Ponieważ otrzymujesz surowy bajt "Obraz" nie może pracować z raw-bytes. Kiedy używasz tej metody 'fakeBitmap.Save (ms, ImageFormat.Png);' otrzymujesz bajty w określonym formacie. –

Powiązane problemy