Mit Assembler Funktion in ein Image Schreiben
-
Gbit ne' Menge Artikel die den Zusammenhang Zeiger / Array erläutern. Wie findet man die nochmal. Hmmm irgendwie mit toggle, Frogger oder so ähnlich

-
Google.....Ist schon klar, der Pointer zeigt auf eine Speicheradresse beschreibe ich nun
den Speicher über den Ptr[1] wird die Ptr Adresse Ptr+1 beschrieben.(oder)Habe mal folgendes probiert,
int *Ptr; int Color; pBitmap->Canvas->Pixels[0][0] = 0x00909090; Ptr = (int*)pBitmap->ScanLine[0]; Color = *Ptr; *Ptr = 0; Image1->Canvas->Draw(0,0,pBitmap);Ich lese den korrekten Wert(0x00909090) über den Pointer nach Color zurück.
Nur funktioniert das schreiben über den Pointer nicht.
-
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.