DC in TImage anzeigen
-
Einen schönen guten Morgen,
ich bitte einmal freundlichst um Hilfe, weil ich wohl ein klein wenig auf dem Schlauch stehe. Ich versuche gerade folgendes zu realisieren.
Meine Software soll ein Bild (Pfad wird als Parameter übergeben) als gesamtes in einem TImage anzeigen und in einer Schleife in ca. ein bis zwei Dutzend Teilbilder (anhängig vom Bildinhalt) zerlegen, die dann alle jeweils einzeln auch wieder in jeweils einem TImage angezeigt werden sollen.
Da ich das Originalbild als Pfad migeteilt bekomme, kann ich die erste Anzeige über TImage->LoadFromFile() realisieren. Klappt auch wunderbar.
Die Ermittlung aller Teilbereiche, die aus dem Gesamtbild heraus erstellt werden sollen, klappt auch wunderbar. Grundsätzlich wird immer die volle Höhe benötigt, das Teilbild ist daher nur durch die linke und rechte Seite begrenzt.
Ob das Kopieren des Teilbildes in ein neues DC klappt (Code innerhalb der if-Abfrage) konnte ich noch nicht testen.
Ich scheitere zur Zeit bei der gedanklichen Umsetzung, wie ich das Teilbild,
auf das ich nun über "hMemPartDC" zugreifen können sollte, in einem TImage angezeigt bekomme.Wäre vielleicht einer so nett, mir diesbezügich auf die Sprünge zu helfen?
Ich poste einmal die komplette Funktion, wobei es mir nur um den Teil innerhalb der if-Abfrage geht, in der ich das erstellte Teilbild anzeigen möchte,Vielen, vielen lieben Dank.
void SplitPic(AnsiString bmpfile) { int w, h, width, height; short int ecl = -9; // column left short int ecr = -9; // column right BITMAP bm; HDC hDC, hMemDC, hPartDC, hMemPartDC; //Bild anzeigen F_Main->ScrShot->Picture->LoadFromFile(bmpfile); Application->ProcessMessages(); //Bild in DC laden HBITMAP hbitmap = (HBITMAP)LoadImage(NULL, bmpfile.c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); hDC = GetDC(NULL); hMemDC = CreateCompatibleDC(hDC); GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bm); SelectObject(hMemDC, hbitmap); w = bm.bmWidth; h = bm.bmHeight; for(int i=0; i<=124; i++) { //Bestimmung von ecl (linke Spalte) und ecr (rechte Spalte) als Teilausschnitt des neues Bildes //Hierzu werden die Bilddaten in ein dreidimensioanles Array geschrieben und analysiert (Sourcecode an dieser Stelle nicht wiedergegeben) //Ergebnis z.B: ecl = 17, ecr = 25, bedeutet, dass das Bild in voller Höhe von der //17. "Spalte" bis zur 25. "Spalte" als neues Bild angezeigt werden soll if ((ecl != -9) && (ecr != -9)) { hPartDC = GetDC(NULL); hMemPartDC = CreateCompatibleDC(hPartDC); SelectObject(hMemPartDC, hbitmap); BitBlt(hMemPartDC, 0, 0, (ecr-ecl+1), h, hbitmap, ecl, 0, SRCCOPY); // Teilbild in TImage anzeigen ??? // // ... ??? DeleteDC(hMemPartDC); } } }
-
Hallo
Wenn du von TImage nach TImage kopieren willst, warum gehst du da den Umweg über die WinAPI? Verwende TImage::Canvas::CopyRect(). Vergiß nicht das du vorher die Dimension des Ziel-TImage passend setzen must.
Auch das eigentliche Problem, das Kopieren von WinAPI nach TIMage dürfte mit der Canvas-Eigenschaft zu erledigen sein, schließlich kapselt das auch nur die WinAPI.
bis bald
akari
-
Warum?
Hmm, weil ich als Parameter den Pfad zur Datei übergeben bekomme und dann überlegt habe, was ich mit dem Bitmap so anstellen kann, ohne mal darauf zu achten, was ich mit dem TImage machen könnte.Werde übers Wochenende nicht zum Programmieren kommen, aber spätestens nächste Woche das ganze mal ausprobieren.
Danke für den Tip und ein schönes Wochenende.
-
Wollte nur nochmal Danke sagen, hat geklappt mit
RECT rcSource = (RECT)Rect(left, top, right+1, bottom+1); RECT rcDest = (RECT)Rect(0, 0, (right-left)+1, (bottom-top)+1); Form1->Image2->Canvas->CopyRect(rcDest, Form1->Image1->Canvas, rcSource);
Ich habe in dem Code einmal meine Variablen durch aussagekräftigere Begriffe ersetzt, so dass den Code vielleicht noch ein anderer mal gebrauchen kann, falls er vor dem gleichen Problem steht.
-
Hallo,
Warum dieses Casten bei Rect. TCanvas::CopyRect verlangt TRect. Da wäre es doch am einfachsten das direkt zu erzeugen.
TRect rcSource(left, top, right+1, bottom+1);