Mit ScanLine genauen Pixelwert erhalten



  • Hallo Leute,

    Ich habe einmal ein kleines Programm geschrieben,
    das mit ...->Canvas->Pixels[x][y] arbeitet.
    Das Programm ist jedoch sehr langsam. Durch vieles Lesen habe ich erfahren, dass ScanLine deutlich schneller sein soll.

    Ich habe das nun versucht. Jedoch erhalte ich bei meinem Ansatz mit ScanLine für dasselbe Pixel einen anderen Wert, wie mit Pixels.

    Ich habe es so probiert:

    Byte * ptr;
    ptr = Image1->Picture->Bitmap->ScanLine[2];
    
    // Um das Ergebnis zu kontrollieren:
    ShowMessage((int)ptr[2]);
    
    // Hier das Ergebnis für Pixels:
    ShowMessage(Image1->Picture->Bitmap->Canvas->Pixels[2][2]);
    
    // Die Position x=2 und y=2 ist hier nur ein Beispiel für einen Pixel und keine weitere Bedeutung.
    

    Ich erhalte nun zwei verschiedene Werte.

    Was mache ich falsch???

    Vielen Dank für eure Hilfe,
    Euer Entertainer



  • Bei ScanLine musst Du aufpassen: Zu jedem Bildpunkt gehoeren mehrere Bytes!!!

    Je nach BitmapFormat. Bei 24 bit- Bitmap bilden 3 Byte einen Bildpunkt, je ein Byte fuer R,G und B. mit Pixels haste einen long- Wert!



  • Hallo Altenburger,

    Wie kann ich dann die einzelnen Werte für R, G und B auslesen???

    Vielen Dank für die Hilfe,
    Entertainer



  • .
      .
      .
      int L,C;
      int R,G,B;
      PRGBTriple srcRow;
    
      BM->PixelFormat = pf24bit;
      for (L=0;L<BM->Height;L++)
      {
        srcRow = (PRGBTriple)BM->ScanLine[L];
        for (C = 0;C < BM->Width; C++)
        {
          //Helligkeit
          R=srcRow[C].rgbtRed;
          G=srcRow[C].rgbtGreen;
          B=srcRow[C].rgbtBlue;
          .
          //Verarbeitung!!!
          .
        }
      }
    


  • Vielen Dank,

    werde ich sobald wie möglich testen!!!

    Entertainer


Anmelden zum Antworten