Als Thema. Vorzugsweise mit C-Code.Wie programmgesteuert erkennen, ob eine Bitmap Alphakanal hat?
2
A
Antwort
1
Mit :: GetDIBits beschrieben, wie auf #333559
1
Auf dieser Antwort ist es nicht klar, was mit GetDIBits zu tun():
GetDIBits (hDC, HBMP, 0, 1, (void **) & Bits, & bmi, DIB_RGB_COLORS);
Bits [3] == Alpha des oberen Bildelements;
Sollten Bits [3] gegen Null getestet werden? was mit diesem Wert zu tun? Danke,
1
Ich habe einen Prototyp implementiert, aber es funktioniert nicht gut, so kann es etwas falsch im Code sein. Ich teile es hier mit der Hoffnung, dass wir es zusammen beheben können:
BOOL HasAlphaChannel(HBITMAP hBmp)
{
HDC hDC = CreateCompatibleDC(NULL);
BITMAPINFO bmi;
void * bits;
unsigned long ul;
BOOL bAlphaChannel = FALSE;
memset(&bmi, 0, sizeof(BITMAPINFO));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
GetDIBits(hDC, hBmp, 0, 1, NULL, &bmi, DIB_RGB_COLORS);
bits = malloc(bmi.bmiHeader.biSizeImage);
// this is returning zero wich means error (why???)
GetDIBits(hDC, hBmp, 0, bmi.bmiHeader.biHeight, &bits, &bmi, DIB_RGB_COLORS);
for(ul = 0; ul < bmi.bmiHeader.biSizeImage; ul += 4)
if(((char *) bits)[ ul + 3 ] != 0)
bAlphaChannel = TRUE;
free(bits);
DeleteDC(hDC);
return bAlphaChannel;
}
Vielen Dank!
3
========= MFC++ Version
private: static Boolean __gc* BitmapHasAlpha(BitmapData __gc* bmpData)
{
if ((bmpData->PixelFormat != PixelFormat::Format32bppArgb) && (bmpData->PixelFormat != PixelFormat::Format32bppRgb))
{
return false;
}
for (Int32 __gc* i = 0; (i < bmpData->Height); i++)
{
Int32 __gc* num2 = (i * bmpData->Stride);
for (Int32 __gc* j = 3; (j < (bmpData->Width * 4)); j += 4)
{
Byte __gc** numPtr = *static_cast<__box Byte __gc***>(((bmpData->Scan0->ToPointer() + num2) + j));
if (numPtr[0] != 0)
{
return true;
}
}
}
return false;
}
========= C# Version
private static unsafe bool BitmapHasAlpha(BitmapData bmpData)
{
if ((bmpData.PixelFormat != PixelFormat.Format32bppArgb) && (bmpData.PixelFormat != PixelFormat.Format32bppRgb))
{
return false;
}
for (int i = 0; i < bmpData.Height; i++)
{
int num2 = i * bmpData.Stride;
for (int j = 3; j < (bmpData.Width * 4); j += 4)
{
byte* numPtr = ((byte*)bmpData.Scan0.ToPointer()) + num2 + j;
if (numPtr[0] != 0)
{
return true;
}
}
}
return false;
}
0
Verwenden GetDIBits (hdc, hBMP, 0, 1, NULL, & bmi, DIB_RGB_COLORS).
Und dann sehen, ob bmi.bmiHeader.biBitCount Wert von hat dann Alphakanal hat, sonst ist es nicht alpha hat.
Verwandte Themen
- 1. , wie zu erkennen, ob Telefon hat
- 2. Programmgesteuert erkennen, ob eine App auf dem iPhone installiert ist
- 3. Erkennen, ob eine Webseite eine JavaScript-Weiterleitung hat
- 4. Erkennen, ob sich die Systemuhr geändert hat?
- 5. Rendern eines transparenten Cursors in Bitmap, der Alphakanal erhält?
- 6. Erkennen, ob ein div mehr als eine Zeile hat
- 7. Erkennen, ob Element Impuls Scrolling gestoppt hat?
- 8. Erkennen von Berührung auf Bitmap
- 9. Android/Java: Erkennen, ob das Gerät eine BACK-Kamera hat
- 10. Erkennen, ob die Struktur padding hat
- 11. kann nicht erkennen, ob Kind-Prozess hat
- 12. UPX programmgesteuert erkennen
- 13. Wie programmgesteuert VB.NET-Verschleierung erkennen?
- 14. Wie programmgesteuert gelöschte Dateien erkennen?
- 15. ein Bild mit Alphakanal Ändern der Größe
- 16. Hinzufügen von Padding zu Bitmap programmgesteuert
- 17. Programmgesteuert PEAR in PHP erkennen
- 18. Erkennen, ob eine Zeichenfolge eine Tabelle enthält
- 19. Erkennen, ob eine Oracle-Datenbank installiert ist
- 20. Können Sie programmgesteuert weißes Rauschen erkennen?
- 21. Erkennen, ob ungesicherte WiFi-Netzwerk hat tatsächlich Internetzugang
- 22. Kann ich erkennen, ob ein Objekt GC.SuppressFinalize aufgerufen hat?
- 23. Wie programmgesteuert prüfen, ob eine EC2-Instanz den Neustart abgeschlossen hat?
- 24. Erkennen, ob sich der Inhalt eines Ordners geändert hat?
- 25. php - erkennen, ob die Variable nur Leerzeichen hat oder nicht
- 26. So erkennen Sie, ob Element 'auto' Höhe hat
- 27. Wie programmiere ich eine Bitmap programmatisch?
- 28. Wie kann ich erkennen, ob ein Mac eine Retina-Anzeige von Java hat?
- 29. Wie kann ich erkennen, ob eine Delphi-Klasse einen virtuellen Konstruktor hat?
- 30. Android - So erkennen Sie, ob ein Headset ein Mikrofon hat
Wenn Sie Bits [3] verwenden, ist es wahrscheinlich 24-bit Bitmap mit BGR [B] GR, so dass Sie Blue-Wert, nicht Alpha erhalten. – dns