Problem mit void-Pointer bei ScanLine (war: Komischer Fehler)



  • Der Compiler sagt, dass meine Variable ptr "void" wäre und es ist ihm nicht möglich wäre void in byte zu laden.
    Probleme macht ihm die folgende Zeile:

    ptr = pBitmap->ScanLine[y];
    

    Hier der komplette Code:

    Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
    
      Byte *ptr;
    
      try
      {
        pBitmap->LoadFromFile("C:\\shirt.bmp ");
        for (int y = 0; y < pBitmap->Height; y++)
        {
          ptr = pBitmap->ScanLine[y];
          for (int x = 0; x < pBitmap->Width; x++)
            ptr[x] = (Byte)y;
        }
        Canvas->Draw(0,0,pBitmap);
    
      }
      catch ()
      {
        ShowMessage("Grafik konnte nicht geladen oder gewechselt werden");
      }
      delete pBitmap;
    

    Ich glaub der Fehler ist nur winzig- würd mich also sehr freuen, wenn wer drüber gucken könnte 🙂
    cya
    David

    PS: 🙂 😃 😉 😃 🙂 🙂 😉

    Edit:
    Bitte aussagekräftige Überschriften wählen. Danke!



  • Hi,

    versuch doch bitte mal

    ptr = (Byte 😉 pBitmap->ScanLine[y];;

    wieso kann ich dir nicht erklären, kenne aber den Fehler.

    ScanLine gibt dir einen Zeiger auf eine Bestimmte Line des Bitmap zurück.
    hast du ein 24Bit Bitmap, dann sind es immer 3Byte Blöcke für ein Pixel.
    Rot wäre das erste Byte, grün das nächste, blau das nächste.
    Dies gilt aber nur für ein 24Bit Bitmap.
    Hast du ein 8 Bit Bitmap, dann dann liegt die ganze Farb information in einem Byte.
    Muss aber zugeben das ich damit seit 1 Jahr nicht mehr gearbeitet habe.

    Hier mal ein Funktionierender Code um grün-Anteil an zu heben.

    void Teffekfenser::green(Graphics::TBitmap *clip, int Amount)
    {int a=Amount; 
     clip->PixelFormat = pf24bit;
     for(int y=0; y<clip->Height; y++)
      {PByteArray p0=(Byte *) clip->ScanLine[y];
       for(int x=0; x<clip->Width; x++)
        {int g=p0[x*3+1]+a;
             p0[x*3+1]=IntToByte(g);
    } } }
    //---------------------------------------------
    Byte Teffektfenster::IntToByte(int i)
    {if(i>255)return 255; else if(i<0)return 0; else return i;
    }
    //-------------------------------
    

    verwende PByteArray müsste aber Byte *ptr entsprechen

    Grüsse


Anmelden zum Antworten