Bitmap rotieren
-
Mann, gut dasses sachts.. ich hab die zwar schonmal gesehen, dachte aber, dass alle 3 code MFC benötigen... Sehe aber gerade, das die 3. Funktion funktioniert.
1000 dank, hast mir viel arbeit erspart

Wie benutze ich die denn jetzt??
irgendwie stürtzt dir Funktion ab:static HANDLE hBitmap = (HBITMAP)LoadImage(NULL,"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //HANDLE GetRotatedBitmap( HANDLE hDIB, float radians, COLORREF clrBack ) HANDLE hRotatedBitmap = GetRotatedBitmap( hBitmap, 10, RGB(100,100,100));D@niel $chumann schrieb:
Ich hab hier auch noch ein Beispiel-Projekt für Bilddrehung in Echtzeit, weiß aber nicht mehr wo ichs her hab, würds dir aber schicken, wenn du willst.
währe schon interessiert, aber wie gesagt, Assember (intel-syntax) und MFC sind nichts für mein Compiler
->->-> e-mail: redeagle.hobby@gmx.NET
-
Ist reine WinApi (wenn ich das richtig sehe) und als VC++ 6 Projekt.
Du hast Post.--------------------------------------------------------------------
Die Funktion von Codeguru erwartet den Winkel im Bogenmaß, durch Grad dürfte sie aber nicht gleich abstürtzen, nichtsdestotrotz:
// 2*PI = 360° // --> #define GradZuRad( x ) ( (x) * 2 * PI / 360)
-
zum code aussa e-mail:
Geht leider nicht DEV-CPP kennt den Datentyp "pBGR" nicht (und ich auch nicht
)
Trotzdem danke für die Bemühungenzum code von codeguru:
Stürtzt trotzdem ab
hier mal mein WM_PAINT:
hDC = BeginPaint(hWnd, &ps); { static HANDLE hBitmap = (HBITMAP)LoadImage(NULL,"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); HANDLE hRotatedBitmap = GetRotatedBitmap( hBitmap, GradZuRad(10), RGB(100,100,100)); HDC BhDC = CreateCompatibleDC(hDC); //um später ein Bild rein zu machen SelectObject(BhDC,hRotatedBitmap); //Hier kommt das Bild rein BitBlt(hDC, 0, 0,40,40,BhDC,0,0,SRCCOPY); //Hier wirds ausgegebe DeleteObject(hRotatedBitmap); } EndPaint(hWnd, &ps);
-
pRGB wird doch im Code definiert:
// The Representation of a 32 bit color table entry #pragma pack(push) #pragma pack(1) typedef struct ssBGR { unsigned char b; unsigned char g; unsigned char r; unsigned char pad; } sBGR; typedef sBGR *pBGR; // <--- genau da! #pragma pack(pop)-------------------------------
RedEagle schrieb:
hier mal mein WM_PAINT:
hDC = BeginPaint(hWnd, &ps); { static HANDLE hBitmap = (HBITMAP)LoadImage(NULL,"test.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); // nur einmal laden (WM_CREATE) und nicht bei jedem WM_PAINT Aufruf HANDLE hRotatedBitmap = GetRotatedBitmap( hBitmap, GradZuRad(10), RGB(100,100,100)); HDC BhDC = CreateCompatibleDC(hDC); //um später ein Bild rein zu machen SelectObject(BhDC,hRotatedBitmap); //Hier kommt das Bild rein BitBlt(hDC, 0, 0,40,40,BhDC,0,0,SRCCOPY); //Hier wirds ausgegebe DeleteDC(BhDC); // hat gefehlt, sonst schlägt folgender Aufruf nämlich fehl DeleteObject(hRotatedBitmap); } EndPaint(hWnd, &ps);Funktionierts den mal oder stürtzt es sofort beim Start ab? Hast du nen Debugger (sehr zu empfehlen)?
-
Uebrigens: Hardwarebeschleunigte Rotation ist viel schneller -- bei Gelegenheit solltest Du Dir mal DirectX 9 anschauen (lad Dir mal den DirectX 9 SDK von Microsoft runter, da sind viele Beispiele dabei).
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnanchor/html/anch_directx.asp
Mit DirectX 9 koenntest Du z.B. ein 2D-Sprite (Billboard Sprite) verwenden, und das beliebig zoomen und drehen.
-
1. #pragma übergeht mein compiler (ka warum)
2. Es stürtzt bein Aufruf der Funktion ab (immer)
3. Man hatte mir mal gesagt, das DX9 nur um die Z-Achse drehen kann -> für 2D anwendungen unbrauchbar !?!?
-
1. Dann lass das Pragma weg vieleicht gehts auch so, ist ja nur, dass der Compiler da nicht an den Bytegrenzen im Struct "rumoptimiert".
2. Ach, jetzt seh ich es, die Funktion erwartet ein DIB (Geräteunabhängiges Bitmap). Kriegst du auch von LoadImage, wenn du noch LR_CREATEDIBSECTION bei den Optionen im letzten Parameter mit angibst.
3. KA. Wenn du aber eh nur ein kleines Bildchen (bisher sinds bei dir ja 40x40 Pixel) drehen willst ist DX wie mit Kanonen auf Spatzen schießen. Das packt IMHO die GDI auch noch locker. In dem Beispiel, das ich dir geschickt hatte, wird ein deutlich größeres Bitmap in Echtzeit gedreht und das läuft selbst auf meinem P2-350 noch problemlos. Was willst du denn überhaupt drehen?
PS: ich hatte im Macro oben noch nen kleinen, schwer zu findenen Fehler (um das 'x' haben die Klammern gefehlt). Ist jetzt behoben.
-
2. Jo, hab ich auch festgestellt
Funktioniert jetzt, dankeIch wollte ein 40×40 großes Bitmap drehen, auf dem eine CD abgebildet ist. Deshalb ist mir die Geschwindikeit auch eigentlich egal

-
RedEagle schrieb:
3. Man hatte mir mal gesagt, das DX9 nur um die Z-Achse drehen kann -> für 2D anwendungen unbrauchbar !?!?
Das ist Quatsch, sonst koennte man mit DX9 ja keine 3D-Spiele programmieren. In DX programmierst Du die Drehung selber, durch die Aenderung von Matrizen; was dabei heraus kommt, ist DX egal. Man kann auch zwei Dreiecke nehmen, und eine Textur darueber legen, und dann die Dreicke zoomen oder drehen. Sprites sind aber bequemer. Uebrigens, die Z-Achse geht bei DX durch den Bildschirm, eine Drehung um die Z-Achse ist daher genau das was Du brauchen wuerdest, aber man kann natuerlich auch um die X oder Y Achse drehen. (Man kann uebrigens auch ein anderes Koordinatensystem verwenden)

Vielleicht hat Dein Bekannter, oder wer auch immer das behauptet hat, die Objekte so gedreht, dass sie mit dem Ruecken nach aussen waren, dann werden sie naemlich nicht gezeichnet (Backside Culling). Ist mir am Anfang auch immer passiert. DX guckt nur den Normalenvektor an, der senkrecht zum betreffenden Dreieck steht. Zeigt der Vektor nach hinten, wird das Dreieck nicht gezeichnet.
-
Hallo,
ich versuch mich auch grad an dieser Funktion von Code Guru. Hab aber leider auch das Problem dass mir das Prog immer abstürzt. Könnte nochmal einer den genauen Aufruf posten? Bei mir sieht das gerade so aus (ich hab natürlich bei euch abgeschaut):void CBitmapRotationDlg::OnPaint() { CDC hDC; static HANDLE hBitmap = (HBITMAP)LoadImage(0, (LPCTSTR)"test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); HANDLE hRotatedBitmap = GetRotatedBitmap( hBitmap, 1.5707, RGB(255,255,255)); HDC BhDC = CreateCompatibleDC(hDC); SelectObject(BhDC,hRotatedBitmap); BitBlt(hDC, 0, 0,40,40,BhDC,0,0,SRCCOPY); DeleteDC(BhDC); DeleteObject(hRotatedBitmap); CDialog::OnPaint(); }Ich habe ein dialogbasierendes Programm, macht das einen Unterschied? Wäre sehr dankbar über Hilfe!
-
Ich glaube der Fehler leigt darin dass "LoadImage" nichts in hBitmap schreibt und das leer bleibt. Deswegen denke ich stürzt die "GetRotatedBitmap" ab. Hab ich bei LoadImage irgendwas falsch gemacht? Ich bekomme ja keine Fehler Meldung.
-
Wenn ich GetLastError() nach LoadImage() aufrufe bekomme ich "8" zurück. Das sollte aber doch eigentlich passen, oder? In der msdn steht ja :
If the function fails, the return value is NULL.
-
Hier bekomme ich ein Access Violation:
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB; int bpp = bmInfo.bmiHeader.biBitCount;bmInfo bleibt leer. Aber das ist da der Source von CodeGuru. Was kann ich da machen?
-
Kann mir dabei niemand helfen? Andere habens doch auch schon hinbekommen mit dem Code. Hilfe!