<?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[Gdiplus::Bitmap]]></title><description><![CDATA[<p>Wie ist es möglich die Transparenz eines bitmaps, das aus dem Speicher geladen wird beizubehalten?</p>
<p>Ich benutze 32bit bitmaps und habe eine struct, die einen BITMAPV5HEADER und einen unterschiedlich großen array von DWORDs enthält.</p>
<p>Ich speichere das Bitmap so ab:</p>
<pre><code class="language-cpp">// Bitmap aus icon(transparent)
Gdiplus::Bitmap* pBmp = Gdiplus::Bitmap::FromHICON(hIc);
DeleteObject(hIc);

// Struct + array für daten
DWORD siz = pBmp-&gt;GetWidth() * pBmp-&gt;GetHeight() * sizeof(DWORD);
PreviewTag* pPt = (PreviewTag*)new BYTE[siz + sizeof(PreviewTag)];
pPt-&gt;FourCharacterCode = 'PREV';
pPt-&gt;CachedBitmap = NULL;
pPt-&gt;FrameNumber = dwFrame;
pPt-&gt;SizeOfData = siz;

// Den header füllen
ZERO_VAR1(pPt-&gt;BitmapHeader);
pPt-&gt;BitmapHeader.bV5Size = sizeof(BITMAPV5HEADER);
pPt-&gt;BitmapHeader.bV5Width = pBmp-&gt;GetWidth();
pPt-&gt;BitmapHeader.bV5Height = pBmp-&gt;GetHeight();
pPt-&gt;BitmapHeader.bV5Planes = 1;
pPt-&gt;BitmapHeader.bV5BitCount = 32;
pPt-&gt;BitmapHeader.bV5Compression = BI_RGB;
pPt-&gt;BitmapHeader.bV5SizeImage = 0;
pPt-&gt;BitmapHeader.bV5XPelsPerMeter = (LONG)pBmp-&gt;GetHorizontalResolution();
pPt-&gt;BitmapHeader.bV5YPelsPerMeter = (LONG)pBmp-&gt;GetVerticalResolution();
pPt-&gt;BitmapHeader.bV5ClrUsed = 0;
pPt-&gt;BitmapHeader.bV5ClrImportant = 0;
pPt-&gt;BitmapHeader.bV5RedMask = 0x000000ff;
pPt-&gt;BitmapHeader.bV5GreenMask = 0x0000ff00;
pPt-&gt;BitmapHeader.bV5BlueMask = 0x00ff0000;
pPt-&gt;BitmapHeader.bV5AlphaMask = 0xff000000;

Gdiplus::BitmapData bmpD;
pBmp-&gt;LockBits(NULL, Gdiplus::ImageLockModeRead, PixelFormat32bppARGB, &amp;bmpD);
if(bmpD.Stride &gt; 0) // Höhe ist negativ bei top-down bitmap
    pPt-&gt;BitmapHeader.bV5Height *= -1;

BYTE* pCur = (BYTE*)bmpD.Scan0;
// Bei top down zu beginn des arrays, bei normalen am ende + stride(negativ)
BYTE* pCurT = (BYTE*)(pPt + 1) + (bmpD.Stride &lt; 0 ? siz + bmpD.Stride : 0);

for(DWORD i = 0; i &lt; bmpD.Height; i++)
{
    for(DWORD j = 0; j &lt; bmpD.Width; j++)
        *(DWORD*)pCurT = *(DWORD*)pCur, pCur += sizeof(DWORD), pCurT += sizeof(DWORD);
    if(bmpD.Stride &lt; 0)
    {
        // Wenn bottom-up vom ende der reihe an den anfang der oberen reihe
        pCur += bmpD.Stride * 2;
        pCurT += bmpD.Stride * 2;
    }
}

pBmp-&gt;UnlockBits(&amp;bmpD);
</code></pre>
<p>Und lade es später so:</p>
<pre><code class="language-cpp">CachedBitmap = new Gdiplus::Bitmap((BITMAPINFO*)&amp;BitmapHeader, this + 1);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/182614/gdiplus-bitmap</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 11:45:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182614.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 May 2007 11:11:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gdiplus::Bitmap on Sun, 27 May 2007 11:11:20 GMT]]></title><description><![CDATA[<p>Wie ist es möglich die Transparenz eines bitmaps, das aus dem Speicher geladen wird beizubehalten?</p>
<p>Ich benutze 32bit bitmaps und habe eine struct, die einen BITMAPV5HEADER und einen unterschiedlich großen array von DWORDs enthält.</p>
<p>Ich speichere das Bitmap so ab:</p>
<pre><code class="language-cpp">// Bitmap aus icon(transparent)
Gdiplus::Bitmap* pBmp = Gdiplus::Bitmap::FromHICON(hIc);
DeleteObject(hIc);

// Struct + array für daten
DWORD siz = pBmp-&gt;GetWidth() * pBmp-&gt;GetHeight() * sizeof(DWORD);
PreviewTag* pPt = (PreviewTag*)new BYTE[siz + sizeof(PreviewTag)];
pPt-&gt;FourCharacterCode = 'PREV';
pPt-&gt;CachedBitmap = NULL;
pPt-&gt;FrameNumber = dwFrame;
pPt-&gt;SizeOfData = siz;

// Den header füllen
ZERO_VAR1(pPt-&gt;BitmapHeader);
pPt-&gt;BitmapHeader.bV5Size = sizeof(BITMAPV5HEADER);
pPt-&gt;BitmapHeader.bV5Width = pBmp-&gt;GetWidth();
pPt-&gt;BitmapHeader.bV5Height = pBmp-&gt;GetHeight();
pPt-&gt;BitmapHeader.bV5Planes = 1;
pPt-&gt;BitmapHeader.bV5BitCount = 32;
pPt-&gt;BitmapHeader.bV5Compression = BI_RGB;
pPt-&gt;BitmapHeader.bV5SizeImage = 0;
pPt-&gt;BitmapHeader.bV5XPelsPerMeter = (LONG)pBmp-&gt;GetHorizontalResolution();
pPt-&gt;BitmapHeader.bV5YPelsPerMeter = (LONG)pBmp-&gt;GetVerticalResolution();
pPt-&gt;BitmapHeader.bV5ClrUsed = 0;
pPt-&gt;BitmapHeader.bV5ClrImportant = 0;
pPt-&gt;BitmapHeader.bV5RedMask = 0x000000ff;
pPt-&gt;BitmapHeader.bV5GreenMask = 0x0000ff00;
pPt-&gt;BitmapHeader.bV5BlueMask = 0x00ff0000;
pPt-&gt;BitmapHeader.bV5AlphaMask = 0xff000000;

Gdiplus::BitmapData bmpD;
pBmp-&gt;LockBits(NULL, Gdiplus::ImageLockModeRead, PixelFormat32bppARGB, &amp;bmpD);
if(bmpD.Stride &gt; 0) // Höhe ist negativ bei top-down bitmap
    pPt-&gt;BitmapHeader.bV5Height *= -1;

BYTE* pCur = (BYTE*)bmpD.Scan0;
// Bei top down zu beginn des arrays, bei normalen am ende + stride(negativ)
BYTE* pCurT = (BYTE*)(pPt + 1) + (bmpD.Stride &lt; 0 ? siz + bmpD.Stride : 0);

for(DWORD i = 0; i &lt; bmpD.Height; i++)
{
    for(DWORD j = 0; j &lt; bmpD.Width; j++)
        *(DWORD*)pCurT = *(DWORD*)pCur, pCur += sizeof(DWORD), pCurT += sizeof(DWORD);
    if(bmpD.Stride &lt; 0)
    {
        // Wenn bottom-up vom ende der reihe an den anfang der oberen reihe
        pCur += bmpD.Stride * 2;
        pCurT += bmpD.Stride * 2;
    }
}

pBmp-&gt;UnlockBits(&amp;bmpD);
</code></pre>
<p>Und lade es später so:</p>
<pre><code class="language-cpp">CachedBitmap = new Gdiplus::Bitmap((BITMAPINFO*)&amp;BitmapHeader, this + 1);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1293031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293031</guid><dc:creator><![CDATA[Dennis123]]></dc:creator><pubDate>Sun, 27 May 2007 11:11:20 GMT</pubDate></item><item><title><![CDATA[Reply to Gdiplus::Bitmap on Sun, 27 May 2007 14:19:00 GMT]]></title><description><![CDATA[<p>...............</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293123</guid><dc:creator><![CDATA[......]]></dc:creator><pubDate>Sun, 27 May 2007 14:19:00 GMT</pubDate></item><item><title><![CDATA[Reply to Gdiplus::Bitmap on Sun, 27 May 2007 15:41:13 GMT]]></title><description><![CDATA[<p>Also wenn ich beim geladenen Bitmap LockBits ausführe, dann haben alle stellen als alpha 255, beim speichern nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293164</guid><dc:creator><![CDATA[Dennis123]]></dc:creator><pubDate>Sun, 27 May 2007 15:41:13 GMT</pubDate></item><item><title><![CDATA[Reply to Gdiplus::Bitmap on Sun, 27 May 2007 17:56:42 GMT]]></title><description><![CDATA[<p>Das speicher passiert natürlich zuvor.<br />
Es muss irgendwo beim bitmap constructor liegen,<br />
aber der andere mit (INT,INT,INT,Pixelformat,void*) zeigt später überhaupt nichts an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293254</guid><dc:creator><![CDATA[Dennis123]]></dc:creator><pubDate>Sun, 27 May 2007 17:56:42 GMT</pubDate></item><item><title><![CDATA[Reply to Gdiplus::Bitmap on Sun, 27 May 2007 19:17:33 GMT]]></title><description><![CDATA[<p>Der Bitmap-Konstruktor ignoriert leider den Alpha-Channel immer <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=";D"
      alt="😉"
    /><br />
Außer manuell z.B. über LockBits() kriegt man den vermutl. nicht von GDI+ selbst gesetzt.</p>
<p>(Das Problem ist das das Bitmap-Format ursprünglich keinen Alpha-Channel vorgesehen hatte und einige Software da wirklich 32Bit Farbtiefe mit meint, andere eben 24Bit+Alpha oder gar einfach irgendwas darein gepappt haben - Microsoft dachte sich daher wohl: Ignorieren wir den besser einfach ;D)</p>
<p>...oder aber falls möglich z.B. auf PNG ausweichen - Da gibt es diese Probleme mit dem Alpha-Channel nicht <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=";D"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293327</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Sun, 27 May 2007 19:17:33 GMT</pubDate></item><item><title><![CDATA[Reply to Gdiplus::Bitmap on Sun, 27 May 2007 19:25:37 GMT]]></title><description><![CDATA[<p>Also an PNG hab ich auch schon gedacht, nur ist es ein bischen ein problem, dass ich die größe der in-den-speicher-zu-speichernden datei nicht direkt bestimmen kann und ich in GDI+ dafür ein IStram brauche. Dazu habe ich dann auch schon mal ein Memory stream gecodet, das problem ist aber, dass ich in der zieldatei, das bild als eine art tag abspeichere, der eine bestimmte größe hat, deswegen wollte ich es halt zuerst mit dem bitmap versuchen, aber wenn einem eben kein anderer ausweg bleibt, dann werd ich mich einmal daran machen das zu implementieren - trotzdem danke für die antwort.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293335</guid><dc:creator><![CDATA[Dennis123]]></dc:creator><pubDate>Sun, 27 May 2007 19:25:37 GMT</pubDate></item></channel></rss>