Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полное Копирование BITMAP, Как реализовать? 
:(
    Опции темы
Dmitriy2k
Дата 25.8.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.11.2005

Репутация: нет
Всего: нет



Здравструйте! Помогите решить следущую проблему:
Нужно скопировать BITTMAP c одного компа на другой.
С сетью никаких проблем нет, зато проблема в следующем:
Не получается полностью скопировать HBITMAP хотя бы локальном компьютере.
ведь HBITMAP - лишь unsigned int.
c другой стороны, можно скопировать BITMAP:

Код

typedef struct tagBITMAP
  {
    LONG        bmType;
    LONG        bmWidth;
    LONG        bmHeight;
    LONG        bmWidthBytes;
    WORD        bmPlanes;
    WORD        bmBitsPixel;
    LPVOID      bmBits;
  } BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP;



хотя проблема в следущем:
все поля битмапа копируются за исключением LPVOID - явно указатель на массив данных битмапа
Какой он длины - не знаю.  

Начал писать для решения данной проблемы следущую функцию:

Код

int CopyBMP(HBITMAP ishodBMP,HBITMAP conechBMP){
    
    BITMAP bmpIshod,bmpConech;
    
//    Bitmap(
    
    GetObject(ishodBMP,sizeof(BITMAP),&bmpIshod);

    bmpConech=bmpIshod;
    //BYTE *bmpIshodBytes,*bmpConechBytes;

    //bmpIshodBytes=(BYTE*)malloc(bmpIshod.bmWidthBytes);
    //bmpConechBytes=(BYTE*)malloc(bmpIshod.bmWidthBytes);
    
    memcpy(bmpConech.bmBits,bmpIshod.bmBits,bmpIshod.bmWidthBytes);
    
    return 0;
}


Подскажите, как лучше решить данную проблему?
PM MAIL   Вверх
GremlinProg
Дата 25.8.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



если формат битмапа непостоянный: bmp, jpg, png, rle и т.п.,
то за отсутствием соответствующих библиотек по работе с ними
можно просто представить все передаваемые битмапы в неупакованный вид с помощью GetDIBits,

ставь biBitCount в 32, biCompression в BI_RGB и считай число байт:
Код

size = height * width * 4

а уже получившийся "распакованный" битмап копируй куда хочешь


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
nworm
Дата 25.8.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: нет
Всего: 8



PM MAIL WWW   Вверх
Dmitriy2k
Дата 25.8.2009, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.11.2005

Репутация: нет
Всего: нет



Я не очень уверен, что иду по правильному пути.
Здесь приведен код серверной части моей программы, который отображает скриншот экрана(с масштабированием).
Код


case WM_SIZE:case WM_PAINT:case WM_SETREDRAW:{
         
    PAINTSTRUCT PaintStruct;

    HDC hDC;
    RECT Rect;
    HWND hWnd;
    hWnd=hDlg;
                    //hWnd=GetDlgItem(hDlg,IDC_PICTURE);
    
    
                        //struct BITMAP bmp;
            
    hDC = BeginPaint(hWnd, &PaintStruct);
    HDC hdesktopDC = ::GetDC(0);
    HDC memDC = CreateCompatibleDC(hdesktopDC);
    DWORD dwWidth = GetDeviceCaps(hdesktopDC, HORZRES);
    DWORD dwHeight = GetDeviceCaps(hdesktopDC, VERTRES);
                         //MessageBox(NULL,FString("горизонталь %d,вертикаль %d",dwWidth,dwHeight),"see",MB_OK);
            
    HBITMAP hBMP = CreateCompatibleBitmap(hdesktopDC, dwWidth, dwHeight);
    HBITMAP hConechBMP = CreateCompatibleBitmap(NULL, dwWidth, dwHeight);
    CopyBMP(hBMP,hConechBMP,hdesktopDC);
    HBITMAP oldBitmap = (struct HBITMAP__*)SelectObject(memDC, hBMP);
              //HBITMAP oldBitmap = (struct HBITMAP__*)SelectObject(memDC, hConechBMP);

    BitBlt(memDC, 0, 0, dwWidth, dwHeight, hdesktopDC, 0, 0, SRCCOPY);

    BitBlt(hDC, 0, 0, dwWidth, dwHeight, memDC, 0, 0, SRCCOPY);
          
                         //Определяем размер рабочей области
    GetClientRect(hWnd,&Rect);
            
                         //копируем bitmap c совместимого на основной контекст с масштабированием
    StretchBlt(hDC,0,0,Rect.right,Rect.bottom,memDC,0,0,dwWidth,dwHeight,SRCCOPY);
            //StretchBlt(hDC,0,0,dwWidth,dwHeight,memDC,0,0,dwWidth,dwHeight,SRCCOPY);
                        //вновь делаем старый bitmap текущим
    SelectObject(memDC, oldBitmap);
            
  
    ReleaseDC(hWnd,hdesktopDC);
    DeleteObject(hBMP); 
    EndPaint(hWnd,&PaintStruct);
            
            
    DeleteObject(hConechBMP); 
    }
    break;




GremlinProg

Мне нужно послать клиенту изображение экрана, вот поэтому я и решил послать клиенту BITMAP
Если я правильно мыслю, то нужно по твоему совету воспользоваться функцией GetDIBits

int GetDIBits(
  HDC hdc,           // handle to DC                               // это поле вполне понятно
  HBITMAP hbmp,      // handle to bitmap                   //  это тоже
  UINT uStartScan,   // first scan line to set                ? 
  UINT cScanLines,   // number of scan lines to copy  ?
  LPVOID lpvBits,    // array for bitmap bits                 // мне не очень понятно, каким из этих полей нужно воспользоваться? Этим?
  LPBITMAPINFO lpbi, // bitmap data buffer                // или этим?
  UINT uUsage        // RGB or palette index                ? 
);

и еще: я не нашел в этой функции поле 
  biBitCount и biCompression.
Конечно, я посмотрел эти поля в MSDN, но мне не понятны дальнейшие действия.
PM MAIL   Вверх
GremlinProg
Дата 25.8.2009, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Dmitriy2k, примеров довольно много, смотри в поиск: http://forum.vingrad.ru/act-Search/CODE/sh...bits/index.html

тебе подойдет любой, который конвертирует битмап в массив байт, этот массив и передавай
а на серверной стороне можно делать обратную операцию, с помощью SetDIBits


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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