Конференция "WinAPI" » Скопировать DDB HBitmap [D7, WinXP]
 
  • QAZ (09.03.16 21:20) [0]
    как скопировать 1 в 1 битмап в памяти по хэндлу, без преобразований в DIB и изменений палитры?
    локальную копию системного битмапа так сказать
  • Игорь Шевченко © (09.03.16 21:58) [1]
  • QAZ (10.03.16 11:06) [2]
    не, не то + устарело
  • Rouse_ © (10.03.16 14:08) [3]
  • Rouse_ © (10.03.16 14:26) [4]
    Хотя нет. А у тебя задача какая просто массив байт получить?
  • QAZ (10.03.16 15:54) [5]
    накидал 2 варианта
    1
    Function CopyBitmap(Const H:HBITMAP):HBITMAP;
    Var memdc,copydc:hdc;
    B: tagBITMAP;
    Begin
    GetObject(h,sizeof(tagBITMAP),@B);
    result:=CreateBitmapIndirect(b);
    memdc:=CreateCompatibleDC(0);
    SelectObject(memdc,h);
    copydc:=CreateCompatibleDC(0);
    SelectObject(copydc,result);
    BitBlt(copydc,0,0,b.bmWidth,b.bmHeight,memdc,0,0,SRCCOPY);
    DeleteDC(memdc);
    DeleteDC(copydc);
    end;


    2 как утверждает Микрософт должен быть быстрей
    Function CopyBitmap(Const H:HBITMAP):HBITMAP;
    Var memdc,copydc:hdc;
    B: tagBITMAP;
    Begin
    GetObject(h,sizeof(tagBITMAP),@B);
    memdc:=CreateCompatibleDC(0);
    SelectObject(memdc,h);
    result:=CreateCompatibleBitmap(memdc,b.bmWidth,b.bmHeight);
    copydc:=CreateCompatibleDC(0);
    SelectObject(copydc,result);
    BitBlt(copydc,0,0,b.bmWidth,b.bmHeight,memdc,0,0,SRCCOPY);
    DeleteDC(memdc);
    DeleteDC(copydc);
    end;


    есть тут что нужно добавить\убавить, кроме проверок естественно?
  • Rouse_ © (10.03.16 16:14) [6]
    после SelectObject будет утечка, DeleteObject результату сделай
  • Rouse_ © (10.03.16 17:09) [7]
    ЗЫ: результату SelectObject есесно
  • QAZ (10.03.16 20:33) [8]
    да так то нет утечки, не пищит нигде
    да и изначальные обекты удаляются вместе с дц, не?
  • QAZ (10.03.16 20:47) [9]
    сделал покошерней
    Function CopyBitmap(Const H:HBITMAP):HBITMAP;
    Var memdc,copydc,dc:hdc;
    B: tagBITMAP;
    SO1,SO2:HGDIOBJ;
    Begin
    dc:=GetDC(0);
    GetObject(h,sizeof(tagBITMAP),@B);
    result:=CreateCompatibleBitmap(dc,b.bmWidth,b.bmHeight);

    memdc:=CreateCompatibleDC(dc);
    SO1:=SelectObject(memdc,h);

    copydc:=CreateCompatibleDC(dc);
    SO2:=SelectObject(copydc,result);

    BitBlt(copydc,0,0,b.bmWidth,b.bmHeight,memdc,0,0,SRCCOPY);

     SelectObject(memdc,SO1);
     SelectObject(copydc,SO2);
      DeleteDC(memdc);
      DeleteDC(copydc);
       ReleaseDC(0,dc)
    end;

 
Конференция "WinAPI" » Скопировать DDB HBitmap [D7, WinXP]
Есть новые Нет новых   [134427   +35][b:0][p:0.001]