Pixel aus Bitmap lesen
-
Erstmal danke für die Antwort.
Das Beispiel habe ich schon gesehen, kann damit aber leider nix anfangen.
Bevor ich hier die Frage gestellt habe, habe ich mich schon ein paar Stunden durch die Doku gelesen, leider ohne Erfolg.Mein Problem ist, ich habe nur das eine HANDLE, und keine möglichkeit weitere Daten der Bitmap zu bekommen.
Somit muss ich irgendwie mit dem HANDLE an die PixelDaten kommen.
-
Zeig erst mal ein wenig Code.
-
Da gibts nicht viel zu zeigen (leider)
ich habe eine Funktion, die von einem anderen Programm aufgerufen wird
Bsp_funk(HANDLE hDib, RECT rect){
}
in "rect" befinden sich koordinaten auf der Bitmap, und hDib ist das HANDLE der Bitmap.
in der Funktion möchte ich dann Pixel aus der Bitmap einlesen.
Ich würde gerne wissen, wie ich auf die Bitmap zugreifen kann, um z.B. mit GetPixel(int x, int y) bzw GetPixel(HDC hdc, int x, int y)
-
Ich würde sagen die mußte in einen CDC laden und dann kannste darüber auf die Pixel zugreifen. Nur sag ich dir gleich wenn du größere Mengen an Pixel aus dem Bild lesen oder schreiben willst, wirst du damit nicht glücklich, den GetPixel und SetPixel sind grottenlangsam. Da solltest du dir direckt die Daten des Bitmaps holen und drauf zu greifen.
-
CTecS schrieb:
Da solltest du dir direckt die Daten des Bitmaps holen und drauf zu greifen.
...und daher hatte ich GetDIBits erwähnt. Ob es eine bessere Möglichkeit gibt, weiß ich nicht (mit den Windows-Bitmap-Funktionen kenne ich mich nicht so aus). GetDIBits kopiert ja. Bei OpenCV kann man einfach direkt den Pointer auf die Bilddaten vom IplImage verwenden. Viel praktischer...
-
dann stellt sich mit nurnoch die Frage wie ich ganzen Parameter für:
int GetDIBits(
__in HDC hdc,
__in HBITMAP hbmp,
__in UINT uStartScan, //Startzeile kann ich einfach angeben
__in UINT cScanLines, //Anzahl der zu scannenden Zeilen
__out LPVOID lpvBits, //hir muss ich mir einen Buffer anlegen
__inout LPBITMAPINFO lpbi,
__in UINT uUsage
);aus dem HANDLE bekomme.
-
HDC zdc = GetDC(NULL); BITMAP bmp; GetObject(hbmp, sizeof(BITMAP), &bmp); BITMAPINFO bmpInfo; bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth = bmp.bmWidth; bmpInfo.bmiHeader.biHeight = -bmp.bmHeight; bmpInfo.bmiHeader.biPlanes = 1; bmpInfo.bmiHeader.biBitCount = 32; // 32 bits per pixel. The same amount of bits in COLORREF bmpInfo.bmiHeader.biCompression = BI_RGB; bmpInfo.bmiHeader.biSizeImage = 0; // Fill the data array int r = GetDIBits (zdc, hbmp, 0, bmp.bmHeight, newData, &bmpInfo, DIB_RGB_COLORS);so etwa in der art sollte es gehen. Aber wie gesagt ich hab auch net viel Ahnung von DiBitmaps, ich benutz immer CBitmap oder CImage

-
Danke für die Hilfe.
Eine Frage hätte ich da noch.
GetDC(NULL); Macht einen Screenshot.
Ich habe aber eine Software, die mir das Bild anzeigt, und mit der geschriebenen dll-Datei das bild bearbeiten soll.
Wenn ein screenshot erzeut wird, habe ich das Interface der Software auf meinem Bild.Wie bekomme ich das angezeigte Bild?
-
GetDC() erzeugt dir nur einen Screenkompatiblen Device-kontext das macht keinen Screenshot. Das sollte auch nur ein Ansatz sein, ob das alles so läuft weiss ich doch auch nicht, aber vielleicht findest du so deine lösung
-
ich habs auch schon gemerkt,
das funktioniert soweit auch ganz gut