Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 2 битмапа в 1 
:(
    Опции темы
JSman
Дата 1.5.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



приветик всем. 
есть два bitmap
один создается из окна (24 bit), второй - 8 bit из файла. работа только через винапи. цель составить 32 bit.

буду рад помощи. без лишних слов привожу код:

Код

interface

type
   Data = record
      SIZE:DWord;
      BIH:^BITMAPINFO;
      DC:HDC;
      HANDLE:HBITMAP;
   end;

function joinBitmaps(WND:HWND; pszFilename:PCHAR ):HBITMAP;
function getBitmapColorTableFromFile  (pszFilename:PCHAR; bits: PSCR):Data;
function getBitmapColorTableFromWindow(WND:HWND):Data;


implementation
function getBitmapColorTableFromFile;

var
   F   : FILE;
   BFH : BITMAPFILEHEADER;
   COLOR_TABLE_SIZE: DWORD;
   i:integer;
begin

   assignfile(f,pszFilename);
   reset(F,1);
   blockread(f, BFH, SizeOf(BFH));
   GetMem(RESULT.BIH, BFH.bfOffBits - 14);
   blockread(f,RESULT.BIH^, {filesize(f) - 14 - COLOR_TABLE_SIZE} BFH.bfOffBits - 14 );
   COLOR_TABLE_SIZE :=  RESULT.BIH^.bmiHeader.biWidth * RESULT.BIH^.bmiHeader.biHeight * RESULT.BIH^.bmiHeader.biBitCount shr 3;

   GetMem(bits, COLOR_TABLE_SIZE);
   blockread(f, bits^, COLOR_TABLE_SIZE, i);
   closefile(f);



   RESULT.DC         := GetDC(0);
   RESULT.HANDLE     := CreateCompatibleBitmap(RESULT.DC , RESULT.BIH^.bmiHeader.biWidth, RESULT.BIH^.bmiHeader.biHeight);
   RESULT.DC         := CreateCompatibleDC(RESULT.DC );

   SetDiBits(RESULT.DC, RESULT.HANDLE, 0, RESULT.BIH^.bmiHeader.biHeight, bits, RESULT.BIH^, DIB_RGB_COLORS);
   SelectObject(RESULT.DC, RESULT.HANDLE);

   RESULT.SIZE := COLOR_TABLE_SIZE;


   // àëüòåðíàòèâà  //  RESULT.HANDLE:=loadimage(0,pszfilename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
end;

function getBitmapColorTableFromWindow;
var

   WND_RECT:TRECT;
   hBmp       : hBitmap;
   DeskDC     : hDC;
   DC         : hDC;
   BFH        : BITMAPFILEHEADER;
   BIH        : tagBITMAPINFO;
   ScrX, ScrY : Integer;
   ScrSize    : Cardinal;
   Bits       : PScr;
   RETURN_DATA: Data;
begin
   Windows.GetWindowRect(WND,WND_RECT);
   SCRX     := (WND_RECT.Right - WND_RECT.Left);
   SCRY     := (WND_RECT.Bottom - WND_RECT.Top);
   ScrSize  := ScrX * ScrY * 3;
   GetMem(Bits, ScrSize);
   DeskDC   := GetDC(WND);
   hBmp     := CreateCompatibleBitmap(DeskDC, ScrX, ScrY);
   DC       := CreateCompatibleDC(DeskDC);

   SelectObject(DC, hbmp);
   BitBlt(DC, 0, 0, SCRX, SCRY, DeskDC, 0, 0, SrcCopy);


   with BFH do
   begin
     bfType      := $4D42;
     bfSize      := SCRX * SCRY * 3 + SizeOf(BFH) + SizeOf(BIH);
     bfReserved1 := 0;
     bfReserved2 := 0;
     bfOffBits   := SizeOf(BFH) + SizeOf(BIH);
   end;


   with BIH.bmiHeader do

   begin
    biSize         := sizeof(BIH);
    biWidth        := SCRX;
    biHeight       := SCRY;
    biPlanes       := 1;
    biBitCount     := 24;
    biCompression  := BI_RGB;
    biSizeImage    := ScrSize;
    biClrImportant := 0;
   end;

   GetDiBits(DC, hbmp, 0, SCRY, Bits, BIH, DIB_RGB_COLORS);
//   DeleteObject(hbmp);



   GetMEM(RETURN_DATA.BIH, SizeOf(BIH));
   RETURN_DATA.BIH^:=BIH;
   RETURN_DATA.SIZE := ScrSize;
   RETURN_DATA.DC:=DC;
   RETURN_DATA.HANDLE:=hbmp;
   RESULT:=RETURN_DATA;
end;


function createBitmap32(W, H:WORD):DATA;
var ScrSize:Cardinal;
begin
  ScrSize  := W * H * 4;

  GETMEM(RESULT.BIH, sizeOf(tagBITMAPINFO));


  with RESULT.BIH^.bmiHeader do

   begin
    biSize         := sizeof(tagBITMAPINFO);
    biWidth        := W;
    biHeight       := H;
    biPlanes       := 1;
    biBitCount     := 32;
    biCompression  := BI_RGB;
    biSizeImage    := ScrSize;
    biClrImportant := 0;
   end;
   RESULT.DC := GetDC(0);
   RESULT.HANDLE     := CreateCompatibleBitmap(RESULT.DC, W, H);
   RESULT.DC         := CreateCompatibleDC(RESULT.DC);

   SelectObject(RESULT.DC,RESULT.HANDLE);

end;


function joinBitmaps;

var
//   Bits8,Bits24,Bits32 : Pointer;
   Bits8,Bits24,Bits32 : PScr;
  xx, yy: Integer; 
  SrcBase, MapBase, DstBase: Pointer; 

  SrcInc: Integer; // Ðàçìåðû ñòðîê ïèêñåëåé
  DST_DATA, MAP_DATA, SRC_DATA:DATA;
//------------------





begin

//   bits24:=nil;
   SRC_DATA:=getBitmapColorTableFromWindow(WND);
   GetMem(bits24, SRC_DATA.BIH^.bmiHeader.biSizeImage);
   GetDiBits(SRC_DATA.DC, SRC_DATA.HANDLE, 0, SRC_DATA.BIH^.bmiHeader.biHeight, bits24, SRC_DATA.BIH^, DIB_RGB_COLORS);
//   BitBlt(GETDC(0),0,0, SRC_DATA.BIH^.bmiHeader.biWidth, SRC_DATA.BIH^.bmiHeader.biHeight,SRC_DATA.DC,0,0,SRCCOPy);




   bits8:=nil;
   MAP_DATA := getBitmapColorTableFromFile(pszfilename, bits8);
   GetMem(bits8, MAP_DATA.BIH^.bmiHeader.biSizeImage);
   GetDiBits(MAP_DATA.DC, MAP_DATA.HANDLE, 0, MAP_DATA.BIH^.bmiHeader.biHeight, bits8, MAP_DATA.BIH^, DIB_RGB_COLORS);
//   BitBlt(GETDC(0),0,0, MAP_DATA.BIH^.bmiHeader.biWidth, MAP_DATA.BIH^.bmiHeader.biHeight,MAP_DATA.DC,0,0,SRCCOPy);

   DST_DATA:=createBitmap32(MAP_DATA.BIH^.bmiHeader.biWidth, MAP_DATA.BIH^.bmiHeader.biHeight);
   GetMem(bits32, DST_DATA.BIH^.bmiHeader.biSizeImage);

   SRCBASE := bits24;
   MAPBASE := bits8;
   DSTBASE := bits32;

  SRCINC := SRC_DATA.BIH^.bmiHeader.biWidth * 3;

  for yy := 0 to MAP_DATA.BIH^.bmiHeader.biHeight - 1 do
begin

  for xx := 0 to MAP_DATA.BIH^.bmiHeader.biWidth - 1 do
  begin
//    alert(inttostr(BYTE(MAPBASE^)));
    DWORD(DSTBASE^):=DWORD(SRCBASE^)  { + BYTE(MAPBASE^) shl 4};
{    alert(inttostr(BYTE (MAPBASE^)));
    alert(inttostr(DWORD(SRCBASE^)));
    alert(inttostr(DWORD(DSTBASE^)));
    alert('ok');
//}
    DWORD(MAPBASE) :=DWORD(MAPBASE) + 1;
    DWORD(SRCBASE) :=DWORD(SRCBASE) + 3;
    DWORD(DSTBASE) :=DWORD(DSTBASE) + 4;

    if xx>=SRC_DATA.BIH^.bmiHeader.biWidth then
    begin
    DWORD(SRCBASE):=DWORD(bits24)+DWORD((yy+1)*SRCINC);
    break;
    end;


  end;
end;
  SetDiBits(MAP_DATA.DC, DST_DATA.HANDLE, 0, SRC_DATA.BIH^.bmiHeader.biHeight, Bits32, SRC_DATA.BIH^, DIB_RGB_COLORS);
  BitBlt(GETDC(0),0,300,DST_DATA.BIH^.bmiHeader.biWidth,DST_DATA.BIH^.bmiHeader.biHeight,DST_DATA.DC,0,0,SRCCOPy);
  result:=0;
end;


Добавлено через 1 минуту и 26 секунд
интересует 213я сторочка
PM ICQ   Вверх
JSman
Дата 3.5.2007, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



внес исправления, все проверил.. работает, но 8битная bitmap отображается не совсем верно.

считываю значение пикселя 8битной так

DWORD(MAP_DATA.BIH^.bmiColors[BYTE(MAPBASE^)]).

уже есть что-то похожее на мой рисунок, но цвета, цвета..
кто-нибудь работал с 8битным форматом?
PM ICQ   Вверх
Alexeis
Дата 3.5.2007, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



JSman, я работал. Заметил тут несколько ньюансов. 
1) Вижу палитра грузиться из файла, но она храниться в том формате в котором она была в файле, в то время как виндовая структура палитры отличается. 
2) Палитра нигде не назначается DC. DC должен знать чем какими цветами ему рисовать.
3) Палитровому формату соответствует константа DIB_PAL_COLORS, а не DIB_RGB_COLORS.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

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


 




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


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

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