
Бывалый

Профиль
Группа: Участник
Сообщений: 226
Регистрация: 13.12.2006
Где: Новосибирск
Репутация: нет Всего: 3
|
Народ есть вопрос,есть код | Код |
#include "windows.h" #include <stdio.h>
ATOM RegMyWindowClass(HINSTANCE hInst, LPCTSTR lpzClassName); LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); HBITMAP ReplaceColor (HBITMAP hBmp,HDC hBmpDC=NULL); UINT * ptPixels; BITMAP bm; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { FILE *f; int i,j; COLORREF a[308*258]; LPCTSTR lpzClass = TEXT("My Window Class!");
if (!RegMyWindowClass(hInstance, lpzClass)) return 1;
HWND hWnd = CreateWindow(lpzClass, TEXT("Dialog Window"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 900, 600, NULL, NULL, hInstance, NULL);
fopen_s(&f,"pixel.txt","w");
HBITMAP hBitmap = (HBITMAP) LoadImage(hInstance, TEXT("f:\\test.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); HDC hdcScreen = GetDC(hWnd); HDC hdcImage =CreateCompatibleDC (hdcScreen); ReplaceColor(hBitmap); SelectObject(hdcImage, hBitmap); BitBlt(hdcScreen, 0, 0, 308, 258, hdcImage, 0, 0, SRCCOPY);
int l=0; for (i=0;i<308;i++) for (j=0;j<258;j++) { a[l]=GetPixel(hdcScreen,i,j); l++; } for (l;l>=0;l--) { fprintf_s(f,"%i %i %i %i\n", GetRValue(a[l]), GetGValue(a[l]), GetBValue(a[l]), a[l]); }
for (i=0;i<308;i++) for (j=0;j<258;j++) { SetPixel(hdcScreen,i,j+300,a[l]); l++; } int size=bm.bmWidth * bm.bmHeight; int size3=bm.bmWidth * bm.bmHeight*
l=0; for (i=0;i<308;i++) for (j=0;j<258;j++) { SetPixel(hdcScreen,i+350,j,ptPixels[l]); l++; }
DeleteDC(hdcImage); ReleaseDC(0, hdcScreen);
MSG msg = {0}; // структура сообщения int iGetOk = 0; // переменная состояния while ((iGetOk = GetMessage(&msg, NULL, 0, 0 )) != 0) // цикл сообщений { if (iGetOk == -1) return 3; // если GetMessage вернул ошибку - выход TranslateMessage(&msg); DispatchMessage(&msg); } fclose(f); // fclose(f1); return msg.wParam; }
ATOM RegMyWindowClass(HINSTANCE hInst, LPCTSTR lpzClassName) { WNDCLASS wcWindowClass = {0}; // адрес ф-ции обработки сообщений wcWindowClass.lpfnWndProc = (WNDPROC)WndProc; // стиль окна wcWindowClass.style = CS_HREDRAW|CS_VREDRAW; // дискриптор экземпляра приложения wcWindowClass.hInstance = hInst; // название класса wcWindowClass.lpszClassName = lpzClassName; // загрузка курсора wcWindowClass.hCursor = LoadCursor(NULL, IDC_ARROW); // загрузка цвета окон wcWindowClass.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE; return RegisterClass(&wcWindowClass); // регистрация класса }
////////////////////////////////////////////////////////////////////////// // функция обработки сообщений LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { // выборка и обработка сообщений switch (message) { /*case WM_LBUTTONUP: // реакция на сообщение MessageBox(hWnd, TEXT("Вы кликнули!"), TEXT("событие"), 0); break;*/
case WM_COMMAND:
break; case WM_DESTROY: PostQuitMessage(0); // реакция на сообщение break; default: // все сообщения не обработанные Вами обработает сама Windows return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
HBITMAP ReplaceColor (HBITMAP hBmp,HDC hBmpDC) { FILE *f1; HBITMAP RetBmp=NULL; if (hBmp) { HDC BufferDC=CreateCompatibleDC(NULL); // DC for Source Bitmap if (BufferDC) { HBITMAP hTmpBitmap = (HBITMAP) NULL; if (hBmpDC) if (hBmp == (HBITMAP)GetCurrentObject(hBmpDC, OBJ_BITMAP)) { hTmpBitmap = CreateBitmap(1, 1, 1, 1, NULL); SelectObject(hBmpDC, hTmpBitmap); } HGDIOBJ PreviousBufferObject=SelectObject(BufferDC,hBmp); // here BufferDC contains the bitmap HDC DirectDC=CreateCompatibleDC(NULL); // DC for working if (DirectDC) { // Get bitmap size GetObject(hBmp, sizeof(bm), &bm); // create a BITMAPINFO with minimal initilisation for the CreateDIBSection BITMAPINFO RGB32BitsBITMAPINFO; ZeroMemory(&RGB32BitsBITMAPINFO,sizeof(BITMAPINFO)); RGB32BitsBITMAPINFO.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); RGB32BitsBITMAPINFO.bmiHeader.biWidth=bm.bmWidth; RGB32BitsBITMAPINFO.bmiHeader.biHeight=bm.bmHeight; RGB32BitsBITMAPINFO.bmiHeader.biPlanes=1; RGB32BitsBITMAPINFO.bmiHeader.biBitCount=32; // pointer used for direct Bitmap pixels access
HBITMAP DirectBitmap= CreateDIBSection(DirectDC, (BITMAPINFO *)&RGB32BitsBITMAPINFO, DIB_PAL_COLORS,(void **)&ptPixels, NULL, 0); if (DirectBitmap) { // here DirectBitmap!=NULL so ptPixels!=NULL no need to test HGDIOBJ PreviousObject=SelectObject(DirectDC, DirectBitmap); BitBlt(DirectDC,0,0,bm.bmWidth,bm.bmHeight,BufferDC,0,0,SRCCOPY); // here the DirectDC contains the bitmap
// Convert COLORREF to RGB (Invert RED and BLUE) fopen_s(&f1,"bit.txt","w"); // After all the inits we can do the job : Replace Color for (int i=((bm.bmWidth*bm.bmHeight)-1);i>=0;i--) { fprintf_s(f1,"%i %i %i %i\n", GetRValue(ptPixels[i]), GetGValue(ptPixels[i]), GetBValue(ptPixels[i]), ptPixels[i]); } // little clean up // Don't delete the result of SelectObject because it's our modified bitmap (DirectBitmap) SelectObject(DirectDC,PreviousObject); // finish RetBmp=DirectBitmap; } // clean up DeleteDC(DirectDC); } if (hTmpBitmap) { SelectObject(hBmpDC, hBmp); DeleteObject(hTmpBitmap); } SelectObject(BufferDC,PreviousBufferObject); // BufferDC is now useless DeleteDC(BufferDC); } } fclose(f1); return RetBmp; }
|
в нём есть HBITMAP, как из него выцепить пиксели, по координатам, в пример картинка выводиться неправильно.
|