2 Stimmen

win32 - Wie kann ich einen Bildschirm als 8-Bit- oder 16-Bit-Bitmap erfassen?

Ich bin gerade erst mit win32 GDI-Programmierung und finden gute Referenzen schwer zu kommen. Ich habe eine einfache Anwendung, die den Bildschirm erfasst, indem Sie das folgende tun:

`UINT32 x,y; x = GetSystemMetrics(SM_CXSCREEN); y = GetSystemMetrics(SM_CYSCREEN);

HDC hdc = GetDC(NULL);
HDC hdcScreen = CreateCompatibleDC(hdc);

HBITMAP hbmp = CreateCompatibleBitmap(hdc, x, y);

SelectObject(hdcScreen, hbmp);

BitBlt(hdcScreen, 0, 0, x, y, hdc, 0, 0, SRCCOPY)

ReleaseDC(NULL, hdc);` 

Ich erfasse eine kompatible Bitmap, die auf meinem Rechner 32-Bit ist. Mit gleichen/ähnlichen Aufrufen, wie würde ich den Bildschirm in 8-Bit erfassen? Wie sieht es mit 16-Bit aus?

3voto

Chris Becke Punkte 32199

使用方法 CreateDIBSection um eine 8bpp-Bitmap zu erstellen, und BitBlt auf diese.


Das Ausfüllen der BITMAPINFO-Struktur wird das Interessante sein. Sie können keine normale BITMAPINFO-Struktur verwenden, da sie nur Platz für einen einzigen Paletteneintrag bietet und Sie bei einem 8-Bpp-Bild die vollen 256 Einträge benötigen.

Wenn man ein wenig schummeln will, kann man eine anonyme Union verwenden, um ein BITMAPINFO mit genügend Platz für seine Palette zu deklarieren.

union
{
  BITMAPINFO bmi;
  struct {
    BITMAPINFOHEADER bmih;
    RGBQUAD extra[256];
  } dummy;
};

bmi.bmiHeader.biSize = sizeof (bmi.bmiHeader);
bmi.biBitCount = 8;
// and so on.

Wie zu den Werten in der Farbtabelle zu initialisieren ... Ich kann nicht denken, einen einfachen Weg, um eine Standard-8bpp-Palette von GDI zu erhalten, wenn seine nicht in 8bpp-Modus. Ich habe einen Verdacht, dass CreateHalftonePalette wird auf einem Gerät ohne Palette nichts bewirken.

2voto

Jerry Coffin Punkte 452852

Ich bin mir ziemlich sicher, dass Sie eine 32-Bit-Bitmap erfassen und diese dann selbst in 8-Bit konvertieren müssen. Bei der 8-Bit-Konvertierung geht normalerweise eine ganze Menge an Daten verloren, und es gibt eine ganze Reihe verschiedener Algorithmen, wie man das macht. Es sei denn, Sie haben wirklich keine Ich würde es mir noch einmal überlegen, ob ich das überhaupt machen will. Es war ein lang Zeit, seit die meisten Menschen einen Grund hatten, sich mit 8-Bit-Bitmaps zu beschäftigen - und sie sind ein Chaos.

Eine 8-Bit-Bitmap (zumindest eine typische) hat eine "Palette", die die 24-Bit-Werte jeder der (bis zu) 256 Farben angibt, die in der Bitmap-Datei verwendet werden sollen. Normalerweise wollen Sie die Farben auswählen, die denen der Original-Bitmap am nächsten kommen. Es gab schon Lose von Algorithmen, die zu diesem Zweck entwickelt wurden. Googelt man nach "Algorithmus zur Farbreduzierung", sollte man eine ganze Reihe von Treffern erhalten, mit einer ganzen Reihe von Varianten, wie man es machen kann, wobei man zwischen Ausführungsgeschwindigkeit, Speicherverbrauch usw. abwägt. Ich kann nicht einmal ansatzweise erraten, welcher für Ihren speziellen Zweck am besten geeignet ist.

Wie ich bereits sagte, würde ich zunächst dazu neigen, etwas Zeit und Mühe darauf zu verwenden, diese Anforderung einfach zu eliminieren. Eine Reduzierung von 32 auf 24 oder sogar 16 Bit ist ziemlich einfach und bewahrt eine lote der ursprünglichen Qualität. Die Umstellung auf 8 Bit ist wesentlich schwieriger y verliert viel an Qualität.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X