Mit Assembler Funktion in ein Image Schreiben



  • Verstehe das nicht so ganz:

    Wo ist Assembler?



  • Wie gesagt, ich kann das ganze lesen aber die Farbe nicht schreiben.

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	pBitmap->Canvas->Pixels[0][0] = 0x00e0e0e0;
    	Ptr = (int*)pBitmap->ScanLine[0];
    	cColor = GetColor(Ptr); //Hier kommt die mit Pixels geschriebene Farbe          
                                    //zurück 0x00e0e0e0;
         WriteColor(Ptr,0); // Farbe an Zeile 0 Spalte 0 auf schwarz ändern
                            // funkt nicht
         Image1->Canvas->Draw(0,0,pBitmap);
    }
    //---------------------------------------------------------------------------
    int TForm1::GetColor(int *Ptr)
    {
    	int *Ptr_ = Ptr;
    	int Color;
    	asm
         {
         	//Entspricht Color = *Ptr
    		mov esi,Ptr_;
              lodsd;
              mov Color,eax;
         }
         return Color;
    }
    //---------------------------------------------------------------------------
    void TForm1::WriteColor(int *Ptr,int Color)
    {
    	int *Ptr_ = Ptr;
    	int Color_ = Color;
    	asm
         {
              //Entspricht *Ptr = Color
    		mov edi,Ptr_;
              mov eax,Color_;
              stosd;
         }
         return;
    }
    


  • Mache ich da irgendwas falsch, jemand ne Idee?



  • also bei mir funktioniert das!

    int *Ptr;
    int  Color;
    
    Image1->Picture->Bitmap->Canvas->Pixels[0][0] = 0x00909090;
    
    Ptr = (int*) Image1->Picture->Bitmap->ScanLine[0];
    
    // Wert auslesen
    Color = *Ptr;
    
    // auf 0 setzen
    *Ptr  = 0;
    
    // nochmal auslesen -> ist 0
    Color = *Ptr;
    


  • Hallo,

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	int *Ptr;
    	int cColor;
    	pBitmap->Canvas->Pixels[0][0] = clGray;
    	Ptr = (int*)pBitmap->ScanLine[0];
    	cColor = *Ptr;    //Farbe für Grau gelesen
    	*Ptr   = 0;       //Farbe Schwarz schreiben
         cColor = *Ptr;       //Lese 0 zurück
         Image1->Canvas->Draw(0,0,pBitmap); //Die Pixelfarbe ist immer noch Grau
    }
    

    Ich lese nach dem 0 schreiben auch wieder 0 zurück, doch die Pixelfarbe
    nach dem Draw bleibt Grau.



  • auf was ist denn CopyMode gesetzt?

    BCB-Hilfe TCanvas::Draw schrieb:

    Wenn die Grafik ein TBitmap-Objekt ist, wird das Bitmap mit dem Wert von CoypMode gezeichnet.



  • CopyMode ist auf default gesetzt.

    Kann ich mir nicht gleich die Speicher Adresse des Image
    besorgen und direkt in das Image schreiben, spart die Funktion
    Draw.

    Nur wie kommt man an die Image Speicher Adresse?



  • wenn du das Bitmap im TImage änderst, kannste dir das Draw sparen und im TImage wird auch die geänderte Farbe angezeigt.



  • ein kleines Beispiel (im TImage befindet sich ein geladenes Bild):

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      int        ImageHeight = Image1->Picture->Bitmap->Height;
      int        ImageWidth  = Image1->Picture->Bitmap->Width;
      RGBTRIPLE *ScanLine;
    
      for (int y = 0; y < ImageHeight; ++y)
      {
        // Zeiger auf den Anfang einer Bildzeile setzen
        ScanLine = (RGBTRIPLE*) Image1->Picture->Bitmap->ScanLine[y];
    
        for (int x = 0; x < ImageWidth; ++x)
        {
          // RGB-Farbwert in Grau (nach Intensität) konvertieren
          unsigned char GrayColor = (ScanLine->rgbtRed + ScanLine->rgbtGreen + ScanLine->rgbtBlue) / 3;
    
          // Grauwert zu weisen
          ScanLine->rgbtRed   = GrayColor;
          ScanLine->rgbtGreen = GrayColor;
          ScanLine->rgbtBlue  = GrayColor;
    
          // Zeiger auf nächstes RGB-Triple setzen
          ++ScanLine;
        }
      }
    
      // Anzeige des Bildes erneuern
      Image1->Invalidate();
    }
    


  • Wie komme ich aber an die Speicher Adresse des Image.
    Soetwas wie ScanLine gibt es nicht.

    Oder wie meist du das.

    Sorry letzten Beitrag von dir noch nicht gesehen.


Anmelden zum Antworten