2017-11-20 3 views
2

Ich habe im Netzwerk surfen, konnte aber keine gute Antwort finden. Also ich habe diesen Code, der mein Bild (es ist immer 512x512) in 4096 8x8 Blöcke schneiden soll. So weit so gut.Divide 2d Array in 8x8 Blöcke C#

private List<int[,]> PictureDivide(Bitmap Image0) 
{ 
    int[,] PartPic; 
    List<int[,]> MacroBlocks = new List<int[,]>(); 
    HeightDivisions = Image0.Height/8; 
    WidthDivisions = Image0.Width/8;   
    for (int a = 0; a < Image0.Height; a = a + 8) 
    { 
     for (int b = 0; b < Image0.Width; b = b + 8) 
     { 
      PartPic = new int[8, 8]; 
      for (int x = b, sx = 0; x < (b + 8); x++, sx++) 
      { 
       for (int y = a, sy = 0; y < (a + 8); y++, sy++) 
       { 
        PartPic[sx, sy] = Image0.GetPixel(x, y).R; 
       } 

      } 
      MacroBlocks.Add(PartPic); 
     } 
    }    
    return MacroBlocks; 
} 

Aber wenn ich nur dieses Bild neu zu zeichnen, ohne Änderungen ist kaputt, wie ich einige Pixel verpasst habe. Ist etwas falsch mit meinem Code, oder wenn Sie eine bessere Auflösung haben, wäre ich dankbar für einen Tipp.

EDIT: Beispiel hinzugefügt: Vorher-Nachher. Vielleicht, wenn ich das Bild rekonstruiere, mache ich etwas schrecklich falsch?

enter image description here enter image description here

+0

Warum nur Sie speichern die 'R' Komponente des Pixels? – Pikoh

+0

Ich benutzte YCbCr, um ein graues Bild zu bekommen. Da alle Werte gleich sind, spielt es keine Rolle. –

+0

Können Sie ein Vorher-Nach-Nachher-Beispiel posten? Ich kann nichts Offensichtliches sehen. – Fildor

Antwort

1

Sieht wie invertiert x und y Dieses versuchen: PartPic [sy, sx] = Image0.GetPixel (x, y) .R;

Antwort für Frage Schließung