2016-12-01 1 views
0

Ich habe Graustufenbilder von einem ArrayList<System.Windows.Controls.Image> horizontal auf einem Canvas ausgelegt. Ihre ImageSource sind vom Typ System.Windows.Media.Imaging.BitmapImage.Get Graustufen Bildhöhe ohne Berücksichtigung weißer Pixel

Gibt es eine Möglichkeit, die Höhe jedes Imagein Pixel zu messen, ohne weiße, nicht transparente Pixel zu berücksichtigen Außerhalb des farbigen Teils?

Sagen wir, ich habe eine Image von Höhe 10, in der die ganze obere Hälfte weiß ist und die untere Hälfte schwarz ist; Ich müsste 5 bekommen, da es Höhe ist. Wenn Image das obere dritte schwarze, das mittlere dritte weiße und das untere dritte Schwarz hätte, wäre die Höhe 10.

Hier ist eine Zeichnung, die die gewünschten Höhen (in blau) von 3 Bildern zeigt:

Example picture

Ich bin bereit, einen anderen Typ für die Bilder zu verwenden, aber es muss möglich sein, entweder von einem bekommen byte[] Array zu diesem Typ, oder Image zu ihm zu konvertieren.

Ich habe die Dokumente auf Image, ImageSource und Visual gelesen, aber ich habe wirklich keine Ahnung, wo ich anfangen soll.

+0

Sie werden ein Histogramm für die Zeilen des Bildes erzeugen wollen, dann das Histogramm analysieren, um die Grenzen der nicht-weißen Pixel zu finden. – Abion47

+0

@ Abion47 Wenn ich ein Histogramm bekommen kann, kann ich wahrscheinlich auch einfach das RGB in jeder Reihe holen und hinzufügen, um zu sehen, ob alles weiß ist. Aber wie bekomme ich solche Daten überhaupt? – Mat

+0

Es hängt davon ab, welchen Objekttyp die 'Quelle' für Ihre Bildsteuerelemente ist. – Abion47

Antwort

1

Der Zugriff auf Pixeldaten von einem BitmapImage ist ein wenig mühsam, aber Sie können ein WriteableBitmap aus dem BitmapImage-Objekt erstellen, das viel einfacher (nicht zu erwähnen, effizienter) ist.

WriteableBitmap bmp = new WriteableBitmap(img.Source as BitmapImage); 
bmp.Lock(); 

unsafe 
{ 
    int width = bmp.PixelWidth; 
    int height = bmp.PixelHeight; 
    byte* ptr = (byte*)bmp.BackBuffer; 
    int stride = bmp.BackBufferStride; 
    int bpp = 4; // Assuming Bgra image format 

    int hms; 
    for (int y = 0; y < height; y++) 
    { 
     hms = y * stride; 
     for (int x = 0; x < width; x++) 
     { 
      int idx = hms + (x * bpp); 

      byte b = ptr[idx]; 
      byte g = ptr[idx + 1]; 
      byte r = ptr[idx + 2]; 
      byte a = ptr[idx + 3]; 

      // Construct your histogram 
     } 
    } 
} 

bmp.Unlock(); 

Von hier aus können Sie ein Histogramm aus den Pixeldaten, konstruieren und dieses Histogramm analysieren, um die Grenzen der nicht-weißen Pixel in den Bildern zu finden.

EDIT: Hier ist eine Silverlight-Lösung:

public static int getNonWhiteHeight(this Image img) 
{ 
    WriteableBitmap bmp = new WriteableBitmap(img.Source as BitmapImage); 
    int topWhiteRowCount = 0; 
    int width = bmp.PixelWidth; 
    int height = bmp.PixelHeight; 

    for (int y = 0; y < height; y++) 
    { 
     for (int x = 0; x < width; x++) 
     { 
      int pixel = bmp.Pixels[y * width + x]; 
      if (pixel != -1) 
      { 
       topWhiteRowCount = y - 1; 
       goto returnLbl; 
      } 
     } 
    } 

    returnLbl: 
    return topWhiteRowCount >= 0 ? height - topWhiteRowCount : height; 
} 
+0

Hmm, das gibt mir ein paar wichtige kompilierende Fehler wie: ' unsicherer Code kann nur erscheinen, wenn das Kompilieren mit/unsafe' und 'WriteableBitmap enthält keine Öffentlichkeit Definition für 'Lock'' (das gleiche gilt für 'BackBuffer' und' BackBufferStride') – Mat

+0

Ich kann unsichere Kompilierung aktivieren, aber für den letzten Fehler kann ich nicht reparieren. Sind Sie sicher, dass das mit Silverlight kompatibel ist? – Mat

+1

@Mat Ich habe nicht gesehen, dass Sie Silverlight verwendet haben, meine Entschuldigung. Ich habe nicht viel Erfahrung mit Silverlight, aber es scheint, als ob der empfohlene Ansatz darin besteht, immer noch die 'WriteableBitmap' zu erstellen, stattdessen aber auf die [Pixels] (https://msdn.microsoft.com/en-us) zu verweisen /library/system.windows.media.imaging.writeablebitmap.pixels(v=vs.95).aspx) Eigenschaft. (Und nein, das erfordert nicht "unsicher" zu verwenden.) – Abion47

Verwandte Themen