2010-08-02 40 views

Trả lời

12

Bạn có thể sử dụng một bộ công cụ gọi là TestApi, là thư viện nguồn mở để hỗ trợ kiểm tra đơn vị. Một trong những API như vậy được gọi Visual Verification API, và nó thực hiện chính xác những gì bạn cần - nó có thể so sánh hai hình ảnh và cho bạn biết nếu họ đều bình đẳng:

// 1. Capture the actual pixels from a given window 
Snapshot actual = Snapshot.FromRectangle(new Rectangle(0, 0, 100, 100)); 

// 2. Load the reference/master data from a previously saved file 
Snapshot expected = Snapshot.FromFile("Expected.png")); 

// 3. Compare the actual image with the master image 
// This operation creates a difference image. Any regions which are identical in 
// the actual and master images appear as black. Areas with significant 
// differences are shown in other colors. 
Snapshot difference = actual.CompareTo(expected); 

// 4. Configure the snapshot verifier - It expects a black image with zero tolerances 
SnapshotVerifier v = new SnapshotColorVerifier(Color.Black, new ColorDifference()); 

// 5. Evaluate the difference image 
if (v.Verify(difference) == VerificationResult.Fail) 
{ 
    // Log failure, and save the diff file for investigation 
    actual.ToFile("Actual.png", ImageFormat.Png); 
    difference.ToFile("Difference.png", ImageFormat.Png); 
} 
4

Nơi đơn giản nhất để bắt đầu sẽ là thứ nguyên. Nếu kích thước không bằng nhau, bạn có thể khai báo chúng sai.

Nếu bạn cần phải trải qua từng pixel, bạn sẽ cần hai cho vòng lặp. Một cái gì đó dọc theo những dòng:

Bitmap ImageA... 
Bitmap ImageB... 

for (Int64 x = 0; x < ImageA.Width; x++) 
{ 
    for (Int64 y = 0; y < ImageA.Height; y++) 
    { 
     if (ImageA.GetPixel(x, y) != ImageB.GetPixel(x, y)) 
     { 
      return false; 
     } 
    } 
} 

Đó là pseudo-code (các chức năng tồn tại trong C#, mặc dù tôi không thể nhớ họ vào lúc này) và rất đơn giản, nhưng là như thế nào bạn muốn thực hiện một điểm ảnh cơ bản kiểm tra điểm ảnh.

Lưu ý, tuy nhiên, để vòng lặp đó hoạt động, hình ảnh phải có cùng kích thước. Nếu không, bạn có thể bị ngoại lệ nếu bạn cố lấy mẫu pixel bên ngoài khu vực nhỏ hơn. Nó cũng sẽ không quá nhanh để so sánh các pixel, vì vậy bạn có thể muốn tìm một cách khác để loại bỏ các bản sao có thể có trước tiên.

Chỉnh sửa: Tôi không chắc chắn cách thực hiện điều này trên Image, nhưng nó khá đơn giản đối với Bitmap s. Không có cách hiển thị nào để lấy dữ liệu pixel của lớp ra khỏi lớp. Tuy nhiên, có vẻ như Bitmaps kế thừa từ Hình ảnh, do đó, điều này có thể vẫn hoạt động. Cho rằng Hình ảnh là một lớp trừu tượng cho cả Bitmap và Metafiles, chúng có thể không có danh sách pixel đơn giản bên trong.

+4

Vì vậy, tôi sẽ chỉ đề cập rằng nếu hai hình ảnh là tương đối lớn, đây sẽ là chậm như một con chó. Tôi sẽ sử dụng Lockbits và cũng lặp qua hàng thay vì cột vì đó là cách nó sẽ được sắp xếp trong bộ nhớ. –

1

Tôi có cùng một câu hỏi ngày hôm nay, cách giải quyết của tôi là để mất image1 và image2 được chuyển thành 256x256 hoặc 128x128 đã được dịch VÀ sau đó tạo một image3 với sự khác biệt giữa chúng, sau đó scan image3 kiểm tra sự khác biệt và trả về số lượng chênh lệch, tôi phát hiện ra số tiền chênh lệch LOWER bằng% nhiều hơn có thể cho họ được bình đẳng. Bằng cách này bạn có thể xác định xem hình ảnh có bằng nhau ngay cả khi chúng có kích thước khác nhau. đây là mã.

double CompareImages(Bitmap InputImage1, Bitmap InputImage2, int Tollerance) 
    { 
     Bitmap Image1 = new Bitmap(InputImage1, new Size(128, 128)); 
     Bitmap Image2 = new Bitmap(InputImage2, new Size(128, 128)); 
     int Image1Size = Image1.Width * Image1.Height; 
     int Image2Size = Image2.Width * Image2.Height; 
     Bitmap Image3; 
     if (Image1Size > Image2Size) 
     { 
      Image1 = new Bitmap(Image1, Image2.Size); 
      Image3 = new Bitmap(Image2.Width, Image2.Height); 
     } 
     else 
     { 
      Image1 = new Bitmap(Image1, Image2.Size); 
      Image3 = new Bitmap(Image2.Width, Image2.Height); 
     } 
     for (int x = 0; x < Image1.Width; x++) 
     { 
      for (int y = 0; y < Image1.Height; y++) 
      { 
       Color Color1 = Image1.GetPixel(x, y); 
       Color Color2 = Image2.GetPixel(x, y); 
       int r = Color1.R > Color2.R ? Color1.R - Color2.R : Color2.R - Color1.R; 
       int g = Color1.G > Color2.G ? Color1.G - Color2.G : Color2.G - Color1.G; 
       int b = Color1.B > Color2.B ? Color1.B - Color2.B : Color2.B - Color1.B; 
       Image3.SetPixel(x, y, Color.FromArgb(r,g,b)); 
      } 
     } 
     int Difference = 0; 
     for (int x = 0; x < Image1.Width; x++) 
     { 
      for (int y = 0; y < Image1.Height; y++) 
      { 
       Color Color1 = Image3.GetPixel(x, y); 
       int Media = (Color1.R + Color1.G + Color1.B)/3; 
       if (Media > Tollerance) 
        Difference++; 
      } 
     } 
     double UsedSize = Image1Size > Image2Size ? Image2Size : Image1Size; 
     double result = Difference*100/UsedSize; 
     return Difference*100/UsedSize; 
    } 

Tested đây với hơn 900 hình ảnh và nó hoạt động như một nét duyên dáng x)

Các vấn đề liên quan