<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[bitmap rotation]]></title><description><![CDATA[<p>Hi.. Also mein Problem ist, dass ich ein Bild (bitmap) rotieren lassen will und es einfach nicht klappen will <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Zunächst hab ich es so versucht, wie es hier beschrieben wird: <a href="http://www.forumromanum.de/member/forum/forum.cgi?USER=user_18391&amp;ACTION=view&amp;ENTRY=1000650082&amp;mainid=1000650082" rel="nofollow">http://www.forumromanum.de/member/forum/forum.cgi?USER=user_18391&amp;ACTION=view&amp;ENTRY=1000650082&amp;mainid=1000650082</a></p>
<p>Wenn ich dies nun versuche (also rotateflag usw.), kommt zwar keine Fehlermeldung, aber ein Bild kommt auch nicht (schon garnicht ein rotiertest -.-)</p>
<p>Nun war mein nächster Versuch es mit getPixel und setPixel zu probieren (also per Hand). Glücklicherweise hab ich gleich eine page gefunden, die dies (angeblich) beschreibt: <a href="http://www.codeguru.com/Cpp/G-M/bitmap/specialeffects/article.php/c1743/" rel="nofollow">http://www.codeguru.com/Cpp/G-M/bitmap/specialeffects/article.php/c1743/</a></p>
<p>Dummweise benutzt das Programm CDC, was wohl ein typ ist, der in den MFC definiert wird. Da ich Borland c++ benutzte hab ich aber keine MFC classes (jedenfalls findet er keine AFXWIN.H -.-).</p>
<p>Nach dieser (erneuten) Enttäuschung dacht ich mir einfach: &quot;ach, mach ich einfach 2 bitmaps und dann mach ich meine rotation mit setPixel und getPixel. Den cdc quatsch lass ich einfach weg :)&quot;<br />
Nachdem ich erfolgreich alles nach &quot;CDC&quot; anmutende aus dem Programm gelöscht hatte, fiel mir auf, dass setPixel und getPixel nicht funktioniert :o. Ich probierte zunächst eine BITMAP &quot;test&quot; zu machen und dann per test.setPixel(test,5,6,RGB(0,0,0)); einen schwarzen Pixel auf das Bild zu machen. Dies ergab (oder ergibt) den Fehler: &quot;E2316 'setPixel' ist kein Element von 'tagBITMAP' in Funktion GetRotatedBitmap(HBITMAP__ <em>,float,unsigned long) in Zeile 76&quot;<br />
Nun dacht ich mir: &quot;naja versuchs mal mit HBITMAP&quot;. Bei HBITMAP ergibt das Ganze folgenden, interessanten Fehler: &quot;E2294 Auf linker Seite der Struktur ist . oder .</em> erforderlich in Funktion GetRotatedBitmap(HBITMAP__ *,float,unsigned long) in Zeile 76&quot;</p>
<p>Nach zahlreichen anderen Versuchen irgendwie das Bitmap gedreht zu kriegen, wende ich mich nun an Euch mit der Bitte:<br />
Kann mir hier vielleicht irgend einer erklären, wie zum teufel ich ein HBITMAP oder auch eine Surface mit BORLAND c++ drehen kann. Am besten so, dass ich als C++ newbie das auf verstehen (am besten auch umsetzen) kann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/77993/bitmap-rotation</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 00:55:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/77993.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 26 Jun 2004 19:45:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to bitmap rotation on Sat, 26 Jun 2004 19:45:34 GMT]]></title><description><![CDATA[<p>Hi.. Also mein Problem ist, dass ich ein Bild (bitmap) rotieren lassen will und es einfach nicht klappen will <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Zunächst hab ich es so versucht, wie es hier beschrieben wird: <a href="http://www.forumromanum.de/member/forum/forum.cgi?USER=user_18391&amp;ACTION=view&amp;ENTRY=1000650082&amp;mainid=1000650082" rel="nofollow">http://www.forumromanum.de/member/forum/forum.cgi?USER=user_18391&amp;ACTION=view&amp;ENTRY=1000650082&amp;mainid=1000650082</a></p>
<p>Wenn ich dies nun versuche (also rotateflag usw.), kommt zwar keine Fehlermeldung, aber ein Bild kommt auch nicht (schon garnicht ein rotiertest -.-)</p>
<p>Nun war mein nächster Versuch es mit getPixel und setPixel zu probieren (also per Hand). Glücklicherweise hab ich gleich eine page gefunden, die dies (angeblich) beschreibt: <a href="http://www.codeguru.com/Cpp/G-M/bitmap/specialeffects/article.php/c1743/" rel="nofollow">http://www.codeguru.com/Cpp/G-M/bitmap/specialeffects/article.php/c1743/</a></p>
<p>Dummweise benutzt das Programm CDC, was wohl ein typ ist, der in den MFC definiert wird. Da ich Borland c++ benutzte hab ich aber keine MFC classes (jedenfalls findet er keine AFXWIN.H -.-).</p>
<p>Nach dieser (erneuten) Enttäuschung dacht ich mir einfach: &quot;ach, mach ich einfach 2 bitmaps und dann mach ich meine rotation mit setPixel und getPixel. Den cdc quatsch lass ich einfach weg :)&quot;<br />
Nachdem ich erfolgreich alles nach &quot;CDC&quot; anmutende aus dem Programm gelöscht hatte, fiel mir auf, dass setPixel und getPixel nicht funktioniert :o. Ich probierte zunächst eine BITMAP &quot;test&quot; zu machen und dann per test.setPixel(test,5,6,RGB(0,0,0)); einen schwarzen Pixel auf das Bild zu machen. Dies ergab (oder ergibt) den Fehler: &quot;E2316 'setPixel' ist kein Element von 'tagBITMAP' in Funktion GetRotatedBitmap(HBITMAP__ <em>,float,unsigned long) in Zeile 76&quot;<br />
Nun dacht ich mir: &quot;naja versuchs mal mit HBITMAP&quot;. Bei HBITMAP ergibt das Ganze folgenden, interessanten Fehler: &quot;E2294 Auf linker Seite der Struktur ist . oder .</em> erforderlich in Funktion GetRotatedBitmap(HBITMAP__ *,float,unsigned long) in Zeile 76&quot;</p>
<p>Nach zahlreichen anderen Versuchen irgendwie das Bitmap gedreht zu kriegen, wende ich mich nun an Euch mit der Bitte:<br />
Kann mir hier vielleicht irgend einer erklären, wie zum teufel ich ein HBITMAP oder auch eine Surface mit BORLAND c++ drehen kann. Am besten so, dass ich als C++ newbie das auf verstehen (am besten auch umsetzen) kann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/548602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/548602</guid><dc:creator><![CDATA[hasu]]></dc:creator><pubDate>Sat, 26 Jun 2004 19:45:34 GMT</pubDate></item><item><title><![CDATA[Reply to bitmap rotation on Sat, 26 Jun 2004 21:13:28 GMT]]></title><description><![CDATA[<p>Ich kann dir zwar keine fertige Lösung anbieten aber in der MSDN hab ich folgendes gefunden: <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_0iwe.asp" rel="nofollow">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_0iwe.asp</a></p>
<p>Es ist praktischerweise eine einzige API-Funktion (aber leider nur verfügbar auf NT-basierenden Systemen). Nur welche Parameter man übergeben muss damit es eine Bitmap rotiert weiß ich nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/548635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/548635</guid><dc:creator><![CDATA[Aziz]]></dc:creator><pubDate>Sat, 26 Jun 2004 21:13:28 GMT</pubDate></item><item><title><![CDATA[Reply to bitmap rotation on Sun, 27 Jun 2004 09:39:07 GMT]]></title><description><![CDATA[<p>ok .. nu hab ichs zwar geschafft mein rotes TEST-Bild zu rotieren, aber nachher ist es weiß -.-. Zum rotieren hab ich folgende Methode genutzt:</p>
<pre><code>HBITMAP GetRotatedBitmapNT( HBITMAP hBitmap, float radians, COLORREF clrBack )
{
        // Create a memory DC compatible with the display
        HDC sourceDC, destDC;
        sourceDC = CreateCompatibleDC( NULL );
        destDC = CreateCompatibleDC( NULL );

        // Get logical coordinates
        BITMAP bm;
        ::GetObject( hBitmap, sizeof( bm ), &amp;bm );

        float cosine = (float)cos(radians);
        float sine = (float)sin(radians);

        // Compute dimensions of the resulting bitmap
        // First get the coordinates of the 3 corners other than origin
        int x1 = (int)(bm.bmHeight * sine);
        int y1 = (int)(bm.bmHeight * cosine);
        int x2 = (int)(bm.bmWidth * cosine + bm.bmHeight * sine);
        int y2 = (int)(bm.bmHeight * cosine - bm.bmWidth * sine);
        int x3 = (int)(bm.bmWidth * cosine);
        int y3 = (int)(-bm.bmWidth * sine);

        int minx = min(0,min(x1, min(x2,x3)));
        int miny = min(0,min(y1, min(y2,y3)));
        int maxx = max(0,max(x1, max(x2,x3)));
        int maxy = max(0,max(y1, max(y2,y3)));

        int w = maxx - minx;
        int h = maxy - miny;

        // Create a bitmap to hold the result
        HBITMAP hbmResult = ::CreateCompatibleBitmap(CreateCompatibleDC( NULL ), w, h);

        HBITMAP hbmOldSource = (HBITMAP)SelectObject( sourceDC, hBitmap );

        HBITMAP hbmOldDest = (HBITMAP)SelectObject( destDC, hbmResult );

         //Draw the background color before we change mapping mode
        HBRUSH hbrBack = CreateSolidBrush( clrBack );
      HBRUSH hbrOld = (HBRUSH)SelectObject( destDC, hbrBack );
       PatBlt( destDC, 0, 0, w, h, PATCOPY );
        ::DeleteObject( SelectObject( destDC, hbrOld ) );

        // We will use world transform to rotate the bitmap
        SetGraphicsMode(destDC, GM_ADVANCED);
        XFORM xform;
        xform.eM11 = cosine;
        xform.eM12 = -sine;
        xform.eM21 = sine;
        xform.eM22 = cosine;
        xform.eDx = (float)-minx;
        xform.eDy = (float)-miny;

        SetWorldTransform( destDC, &amp;xform );

        // Now do the actual rotating - a pixel at a time
        BitBlt(destDC,0,0,bm.bmWidth, bm.bmHeight,sourceDC, 0, 0, SRCCOPY );

        // Restore DCs
        ::SelectObject( sourceDC, hbmOldSource );
        ::SelectObject( destDC, hbmOldDest );

        return hbmResult;
}
</code></pre>
<p>die hier aufgerufen wird:</p>
<pre><code>BOOL LoadPic(LPCSTR lpcFileName, LPDIRECTDRAWSURFACE7 *lplpDestSurf7, DDSURFACEDESC2 *lpDestDesc2)
{
        HBITMAP hbm;
        BITMAP  bm;
        HDC hdcPic, hdcSurf;

        hbm = (HBITMAP)LoadImage(NULL, lpcFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);

        //hier wird Rotationsmethode aufgerufen
        hbm = GetRotatedBitmapNT(hbm,3.1415,NULL);

        if (hbm == NULL)
        {
                MessageBox(NULL, &quot;Konnte Bild nicht laden&quot;, NULL, MB_OK);
                return FALSE;
        }

        GetObject(hbm, sizeof(bm), &amp;bm);

        lpDestDesc2-&gt;dwSize = sizeof(DDSURFACEDESC2);
        lpDestDesc2-&gt;dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
        lpDestDesc2-&gt;ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
        lpDestDesc2-&gt;ddsCaps.dwCaps2 = 0;
        lpDestDesc2-&gt;dwWidth  = bm.bmWidth;
        lpDestDesc2-&gt;dwHeight = bm.bmHeight;

        if (lpDirectDraw-&gt;CreateSurface(lpDestDesc2, lplpDestSurf7, NULL) != DD_OK)
        {
                MessageBox(NULL, &quot;Erzeugen der Bildzeichenfläche fehlgeschlagen!&quot;, NULL, MB_OK);
                DeleteObject(hbm);
                return FALSE;
        }
        if ((*lplpDestSurf7)-&gt;GetSurfaceDesc(lpDestDesc2) != DD_OK)
        {
                MessageBox(NULL, &quot;Konnte komplette Bildsurfacebeschreibung nicht hohlen&quot;, NULL, MB_OK);
                DeleteObject(hbm);
                return FALSE;
        }

        hdcPic = CreateCompatibleDC(NULL); //ein Gerät im Speicher erzeugen

    SelectObject(hdcPic, hbm); //diesem nun das Bild zuweisen, dabei
                               //werden vom GDI die Farben angepasst
        //hohlen des Gerätehandels der Bildzeichenfläche
    if ((*lplpDestSurf7)-&gt;GetDC(&amp;hdcSurf) != DD_OK)
    {
                MessageBox(NULL, &quot;GetDC der Bildzeichenfläche fehlgeschlagen&quot;, NULL, MB_OK);
                DeleteDC(hdcPic);
                DeleteObject(hbm);
                return FALSE;
    }
        //das kopieren der Bildinhalte von einem Gerät zum anderen
        BitBlt(hdcSurf, 0, 0, bm.bmWidth, bm.bmHeight, hdcPic, 0, 0, SRCCOPY);
        //Gerätehandel der Bildzeichenfläche wieder freigeben
        (*lplpDestSurf7)-&gt;ReleaseDC(hdcSurf);

        //dieses Gerät wieder entfernen, da es nicht mehr benötigt wird
        DeleteDC(hdcPic);

        //das Bitmap wird nicht länger gebraucht -&gt; Speicherfreigabe
        DeleteObject(hbm);
        return TRUE;
}
</code></pre>
<p>die wiederrum in winmain aufgerufen wird</p>
<pre><code>LoadPic(&quot;Test.bmp&quot;,&amp;lpddsBitmap,&amp;bitmapsurface);
SetRect(&amp;rectbitmap, 220, 165, 420, 315);
</code></pre>
<p>und später dann</p>
<pre><code>lpddsBack-&gt;Blt(&amp;rectbitmap, lpddsBitmap, NULL, DDBLT_WAIT, NULL);
</code></pre>
<p>wenn ich ein buntes auto-bild reinmache, bleibt nur ein weißer strich vom vorher so bunten auto übrig oo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/548760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/548760</guid><dc:creator><![CDATA[hasu]]></dc:creator><pubDate>Sun, 27 Jun 2004 09:39:07 GMT</pubDate></item></channel></rss>