HBITMAP bei DC Erstellung kann nicht angesprochen werden
-
Das ist nicht der Fall! Es geht lediglich um eine Diplomarbeit - möglichst effizient Karten in Form eines Neuronalen Netzes auszuwerten.
Parallel soll über ein Expertensystem die Abweichung bestimmt werden – d.h. Fehlerquote.
-
Hi Warum ziehst du denn immer die Ausgangskoordinaten ab ? - Das ist überflüssig
.
Ich würd das erstmal, auch wegen der Übersichtlichkeit, so abändern:HDC dcCard = CreateCompatibleDC( m_ptBuffer[iT].dcmem ); HBITMAP hBMCard = CreateCompatibleBitmap( m_ptBuffer[iT].dcmem, recCard0.right, recCard0.bottom); HBITMAP hBMCardold = (HBITMAP)SelectObject(dcCard, hBMCard ); ... BitBlt( dcCard, 0, 0, recCardX.right, recCardX.bottom, m_ptBuffer[iT].dcmem, 0, 0, SRCCOPY ); ... // anhand eines file-save ist zu erkennen, dass dcCard das richtige bild beinhaltet.FrEak33 schrieb:
Frage:
Kann ich ohne probleme mit hBMCard auf das Bitmap zugreifen oder gibt es hier Probleme (was ich vermute).Was heißt den zugreifen, wenn du vergleichen willst, musst du das über einen Speicherkontext anstellen.
FrEak33 schrieb:
... HBITMAP hLocalCard = (HBITMAP)LoadImage( NULL, szFileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE ); // compare if( !__compare_bitmaps( hLocalCard, hBMCard ) ) { OutputDebugString( "\nNicht erkannt" ); } else { OutputDebugString( "\nNicht erkannt" ); } ...."__compare_bitmaps" funktioniert 100%. Evt. kann jemand von euch was dazu sagen.
Bye
Naja, poste mal die Funktion...ich verstehe außerdem nicht, das wenn die Funktion __compare_bitmaps sowohl false, auch auch ungleich
false zurückgibt, die Bitmap 'nicht erkannt' wird
.PS: Nutz mal die Forum-Suchfunktion, ich hatte hier mal ne Funktion zum vergleichen von Bitmaps gepostet.
-
Hi, ich meine natürlich:
// compare
if( !__compare_bitmaps( hLocalCard, hBMCard ) )
{
OutputDebugString( "\nNicht erkannt" );
}
else
{
OutputDebugString( "\nerkannt" );
}Naja die compare funktion funktioniert einwandfrei, hatte diese bereits von deinem geposteten Quellcode abgeleitet.
Nachdem ich mit diesem Quellcode das bild geladen habe, müsste doch das ganze praktisch funktionieren, wie ich den Quellcode verfasst habe, oder ist hierbei noch ein Denkfehler vorhanden?
-
FrEak33 schrieb:
Naja die compare funktion funktioniert einwandfrei, hatte diese bereits von deinem geposteten Quellcode abgeleitet.
Nachdem ich mit diesem Quellcode das bild geladen habe, müsste doch das ganze praktisch funktionieren, wie ich den Quellcode verfasst habe, oder ist hierbei noch ein Denkfehler vorhanden?
Ich weiß ja nicht, ob du beim Ableiten n Fehler gemacht hast
.
-
Naja die CompareBitmap Funktion funktioniert bei bildern, die über LoadImage geladen wurden perfekt.
Mich interessiert primär, ob die "formaelle" Vorgehensweise richtig ist.
-
Also in deinem geposteten Code-Snippet, hab ich keinen Fehler gefunden.
-
Ich weiß ja nicht, wie deine Bild-Vergleichs-Funktion arbeitet, aber wenn du in 32-Bit arbeitest, sind evtl. die Alpha-Werte verschieden... Falls die Funktion selbstgeschrieben ist, könntest du dir von ihr ja auch ausgeben lassen, an welcher Stelle die Bilder ungleich sind (Größe, welcher Pixel, ... )!
Wenn sie nicht selbstgeschrieben ist, hol dir die Raw-Bitmap-Bits und speicher sie in einer Datei ab; von beiden Bildern. Dann vergleichst du sie im Hex-Editor. Irgendwas muss an den Bildern ja unterschiedlich sein...
-
Also, es liegt daran, dass ich einmal einen 24 Bit DC und einmal einen 32 Bit DC (vom desktop) habe.
Ich dachte mir hierbei, hey vergleichste RGB mit GetPixel und gut ist (egal ob 24 oder 32 bit).
Naja nun hab ich festgestellt, dass die GetPixel Funktion nicht bei einem 32 Bit DC funktioniert... (kommt -1 bei jedem Pixel).Sind eig. die restlichen 8 Bit der Alpha-wert?
Kennt jemand evt. hierbei eine gute Lösung?
-
FrEak33 schrieb:
Sind eig. die restlichen 8 Bit der Alpha-wert?
32-Bit entsprechen 16,7 Millionen Farben...da sind die Alpha-Werte auch drin
.FrEak33 schrieb:
Kennt jemand evt. hierbei eine gute Lösung?
Jo du kannst deine 32er-Bit-Bitmap^^ in ne 24-Bit Bitmap konvertieren.
Dazu brauchte IMHO BITMAPINFOHEADER für.
-
Hmm. .. Wollte über GetDIBits() die Pixel von meinem Buffer holen, leider schlägt das immer fehl - die funktion gibt mit einfach keinen pointer auf einen speicher. Genauso bekomm ich invalide ergebnisse bei CreateDIBSection().
-
Bei GetDIBits musst du einen Pointer auf einen Speicher von dir übergeben. Da werden die Daten dann reinkopiert. Reine Vorsichtsmaßnahme von Windows^^
Soweit ich weiß, funktioniert GetBitmapBits auch. Soll man nicht mehr benutzen (warum auch immer...), aber solange es funkioniert

-
Also bei mir klappt auch GetBitmapBits nicht

void *pBits=NULL; int read=0; // 100x100 32 bit if( (read=GetBitmapBits( hBmp, (100*100)*4, &pBits )) > 0 ) { printf( "\n Success" ); }
-
struct SCOLOR32 { UCHAR R, G, B, A; }; ... SCOLOR32* pBits = new SCOLOR32 [ 100*100 ]; int read=0; // 100x100 32 bit if( (read=GetBitmapBits( hBmp, (100*100)*4, pBits )) > 0 ) { printf( "\n Success" ); ... } delete [] pBits;EDIT: ...
-
Muss dat nit SCOLOR32* pBits = new SCOLOR32 [ 100*100 ] heißen ?^^
-
Oh, hast recht

Editier ich schnell, vielleicht hat ers noch nicht gelesen
Danke

-
Besten Dank. Dachte der pointer wird von der funktion erstellt.
-
Soo.. also habe leider grundelegende Probleme mit GetBitmapBits(), wobei ich denke das liegt eher an den Pointern.
Ich habe zwei weiße Bitmaps. Bei einem sind in x und y Richtung 3*3=9 Pixel rot.
Ich möchte jetzt jeden Pixel überprüfen und alle, die nicht gleich sind ausgeben.int cmp_count=0; for( int iY=0; iY < bmSrc.bmWidth; iY++ ) { printf( "\nNew Line"); for( int iX=0; iX < bmSrc.bmWidth; iX++ ) { BMP_COLOR24 clr_src = ((BMP_COLOR24*)lpBitsSrc)[iY*bmSrc.bmWidth+iX]; BMP_COLOR24 clr_cmp = ((BMP_COLOR24*)lpBitsCmp)[iY*bmCmp.bmWidth+iX]; if( clr_src.R == clr_cmp.R && clr_src.G == clr_cmp.G && clr_src.B == clr_cmp.B ) { cmp_count++; } else { printf( "\n%d, %d", iX, iY ); break; } }//for }//forAusgabe: (NUR 3!!!)
New Line
0,0
New Line
0,1
New Line
0,2Eigentlich müssten es 6 sein.

-
Keiner Eine Ahnung?

-
Hatte alles seine Richtigkeit. lag an einem Problem meinerseits.
-
Achja, es wurden nicht alle Pixel ausgegeben, da die Vergleich durch ein break; unterbrochen wurde, sobald die ersten nicht gleich sind.
Also immer aufpassen! Und nochmals besten Dank an alle, die an diesem Thread mitgewirkt haben.