Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> HBITMAP в массив пикслей, HBITMAP CreateDIBSection 
:(
    Опции темы
UserNet
Дата 21.6.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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, как из него выцепить пиксели, по координатам, в пример картинка выводиться неправильно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1359 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.