Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.08;
Скачать: CL | DM;

Вниз

Прорыв в загрузке битмапов!!!   Найти похожие ветки 

 
Dib@zol   (2006-08-19 14:03) [0]

Люди!!! Я тут написал код, грузящий битмапы из ресурсов на голом API! Тока не знаю, у всех ли пойдёт :( Будте белыми братьями, скажите как выложить файл в Инет, и протестируйте! Или просто если кому нужно, возьмите исходники. Чёта я сёдня такой добрый!!! ;)


 
Don Nikola ©   (2006-08-19 14:46) [1]

HBITMAP LoadBitmap(

   HINSTANCE hInstance, // handle of application instance
   LPCTSTR lpBitmapName  // address of bitmap resource name
  );

?
Или очередная революция с GDI+/IE/Vista?


 
Dib@zol   (2006-08-19 15:03) [2]

нет, воттак:

type
TPxArr=array[0..0]of byte;           // | Это всё нужно для
PPxArr=^TPxArr;                      // | текстурирования.
TQPxArr=array of array of COLORREF;  // | COLORREF ближайший
                                     // | предок TColor"a
...
// Вот эта функция годится для АБСОЛЮТНО ЛЮБЫХ битмапов,
// которые вам взбредет в голову загрузить из ресурса.
// Если его размеры - не степени 2, то просто добавьте в
// конец GluScaleImage / GluBuild2DMipmaps, на ваш вкус.
// ЗЫ: А лучше, для уменьшения системных потерь, вручную
// приведите его к степеням 2, прежде чем в ресурс пихать.
function makeTex(const FileName : String;
var sWidth, tHeight: GLsizei): PPxArr;
var
 i, j, k:integer; // i, j - для PQPxArr, k - для текстурного
 _r, _g, _b:byte; // Цвета для преобразования COLORREF->RGB
 bmpDC:HDC;       // Девайс-контэкст для битмапа
 b:HBITMAP;       // А вот и он сам
 c:TQPxArr;       // Это временный массив под текстуру
 sz:SIZE;         // Ширина и высота текстуры

// -------- Краснову привет. Оупен Джи Эль рулЁз! -------- \\
procedure ColorToGL (c : cardinal; var R, G, B : byte);
begin
R := (c mod $100);
G := ((c div $100) mod $100);
B := (c div $10000);
end;
// ------------------------------------------------------- \\
function getBitmapSize(b:HDC):SIZE;
var c:COLORREF;
i, j:integer;
begin
// Если кто желает, может найти размеры через GetDeviceCaps.
// Правда у меня он не пашет. А мой способ самый совместимый
i:=0;
j:=0;
repeat
 c:=GetPixel(bmpDC, i, 0); // Высота
 if c<>CLR_INVALID then    
   i:=i+1
 else break;               // Всё, последний пиксель
until 1=0;                  // Смерррррртельный номерррррр!!!
repeat
 c:=GetPixel(bmpDC, 0, j); // Ширина
 if c<>CLR_INVALID then    
   j:=j+1
 else break;               // Всё, последний пиксель
until 1=0;                  // Смерррррртельный номерррррр!!!
result.cx:=i;
result.cy:=j;
end;
// ------------------------------------------------------- \\
begin
b:=LoadBitmap(HInstance, PChar(fileName)); // бмп из ресурса

bmpDC:=CreateCompatibleDC(0);         // хз как, но пашет
SelectObject(bmpDC, b);               // GDI: выбор объекта

sz:=getBitmapSize(bmpDC);             // Вычисляем размеры
SetLength(c, sz.cx, sz.cy);           // Строим массив

for i:=0 to sz.cx-1 do                // | Попиксельно
for j:=0 to sz.cy-1 do                // | читаем в него
c[i, j]:=GetPixel(bmpDC, i, j);       // | текстурку

DeleteObject(b);                      // GDI: удал-е объекта
ReleaseDC(b, bmpDC);                  // Свободу контекстам!
DeleteDC(bmpDC);                      // Им же и смерть...

GetMem (Result, sz.cx*sz.cy*3);       // Основной массив
k:=0;                                 // Ячейка - первая
for i:=0 to sz.cy-1 do begin
for j:=0 to sz.cx-1 do begin
ColorToGl(c[j, (sz.cy-1)-i], _r, _g, _b); // Перекодируeм
result[k]:=_r;                        // | И пишем
result[k+1]:=_g;                      // | в главный
result[k+2]:=_b;                      // | текстурный
k:=k+3;                               // | массив
end;
end;

Finalize(c);                          // PQPxArr уже незафиг
sWidth:=sz.cy;                        // | Передаём
tHeight:=sz.cx;                       // | размеры
end;


Что лоудБитмап это ежу ясно.
А как ТЫ потом заполняешь массив пикселями битмапа?


 
Don Nikola ©   (2006-08-19 16:03) [3]

>procedure ColorToGL (c : cardinal; var R, G, B : byte);

Вы маниак, уважаемый ;) Вы бы еще через флоаты перевод делали.

>R := (c mod $100);

R:=c;

>G := ((c div $100) mod $100);

G:=c shr 8;

>B := (c div $10000);

B:=c shr 16;

>// Если кто желает, может найти размеры через GetDeviceCaps.
>// Правда у меня он не пашет. А мой способ самый совместимый

Есть способ лучше, прочитать хидер.

>ColorToGl(c[j, (sz.cy-1)-i], _r, _g, _b); // Перекодируeм
>result[k]:=_r;                        // | И пишем
>result[k+1]:=_g;                      // | в главный
>result[k+2]:=_b;

Это простите что? Я с OGL не работал. Это первеод из BGR в RGB или из 32bpp в 24bpp? Так или иначе это все лечго делается без разбития цвета на компоненты путем сдвигов и масок.

>Что лоудБитмап это ежу ясно.
>А как ТЫ потом заполняешь массив пикселями битмапа?

Я, к сожалению, так и не понял весь эзотерический смысл работы с битмапами через GDI и сделал свой простой лисапед, хотя с учетом того что найти в GDI нормальный вывод графики с colorkey я тоже не смог, то вероятно это не такая уж большая потеря для меня.

http://donnikola.narod.ru смотреть файл NVideo.pas в архиве NXGDI.rar


 
OSokin ©   (2006-08-20 16:43) [4]

ЧТО ЭТО ЗА УЖАС??? ЭТО ЖЕ ДЕЛАЕТСЯ ПАРОЙ СТРОК, ДАЖЕ ЕСЛИ ЮЗАТЬ OPENGL!!!
Если хочешь узнать, как работать с GDI, то спроси лучше меня или antonn"а. Кстати, GDI представляет 2D средства не хуже, чем OGL или DirectDraw. Хочешь подробнее - мыль, отвечу практически на все вопросы.
Вот тебе кусок кода из FreeDraw"а, последнюю версию которого можно найти на http://code.darthman.com в разделе "Скачать" конкурс "Космосим" (если там нет - посмотир в форуме):
function LoadBitmapFromFile(FileName: String): HBitmap;
var
 F: File; //Файл для загрузки заголовка битмапа
 // Заголовочные структуры
 BitmapFileHeader : TBITMAPFILEHEADER;
 BitmapInfoHeader : TBITMAPINFOHEADER;
 // Счетчик чтения файла. Применяется для проверки
 ReadCount : DWORD;
 Bmp: HBitmap;
begin
 LoadBitmapFromFile := 0;
 // Открытие файла и установка на начало
 AssignFile(F, FileName);
 Reset(F, 1);
 // Чтение заголовка TBitmapFileHeader
 BlockRead(F, BitmapFileHeader, SizeOf(TBitmapFileHeader), ReadCount);
 if (ReadCount <> SizeOf(TBitmapFileHeader)) then
 begin //Ошибка чтения
   CloseFile(F);
   Exit;
 end;
 // Чтение заголовка TBitmapInfoHeader
 BlockRead(F, BitmapInfoHeader, SizeOf(TBitmapInfoHeader), ReadCount);
 if (ReadCount <> SizeOf(TBitmapInfoHeader)) then
 begin //Ошибка чтения
   CloseFile(F);
   Exit;
 end;
 CloseFile(F);
 Bmp := LoadImage(hInstance, PChar(filename), IMAGE_BITMAP, BitmapInfoHeader.biWidth, BitmapInfoHeader.biHeight, LR_LOADFROMFILE);
 SetBitmapDimensionEx(Bmp,BitmapInfoHeader.biWidth,BitmapInfoHeader.biHeight,nil) ;
 Result := Bmp;
end;

procedure TImage.LoadFromFile(DC: HDC; FileName: String);
var
 NewImgHandle: HBitmap;
begin
 NewImgHandle := LoadBitmapFromFile(FileName);
 if ImgHandle <> 0 then begin
   DeleteObject(ImgHandle);
 end;
 ImgHandle := NewImgHandle;
 if ImgDC<>0 then begin
   DeleteDC(ImgDC);
 end;
 ImgDC := CreateCompatibleDC(DC);
 SelectObject(ImgDC, ImgHandle);
end;

procedure TImage.LoadFromRes(DC: HDC; ResName: String);
var
 NewImgHandle: HBitmap;
 bi: BitmapInfo;
begin
 NewImgHandle := LoadImage(hInstance, PChar(ResName), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
 if ImgHandle <> 0 then begin
   DeleteObject(ImgHandle);
 end;
 ImgHandle := NewImgHandle;
 if ImgDC<>0 then begin
   DeleteDC(ImgDC);
 end;
 ImgDC := CreateCompatibleDC(DC);
 SelectObject(ImgDC, ImgHandle);
 GetDIBits(ImgDC, ImgHandle, 0, 0, nil, bi, DIB_RGB_COLORS);
 SetBitmapDimensionEx(ImgHandle, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight, nil);
end;


 
Don Nikola ©   (2006-08-21 15:49) [5]

2OSokin:

>Кстати, GDI представляет 2D средства не хуже, чем OGL или DirectDraw.

А можно ссылку на статью в msdn/win32help про то, как _нормально_ отрисовать картинку с colorkey или своими словами расскажи. Под "нормально" я подразумеваю отсутствие танцев с бубном вокруг логических операций с тремя битмапами?
Задаю вопрос не в мыло потому что мне кажеться ответ на него будет интересен не только мне.


 
Vovan#1   (2006-08-22 00:28) [6]

>А можно ссылку на статью в msdn/win32help про то, как _нормально_ отрисовать картинку с colorkey или своими словами расскажи. Под "нормально" я подразумеваю отсутствие танцев с бубном вокруг логических операций с тремя битмапами?

TransparentBlt отменили?


 
Don Nikola ©   (2006-08-22 13:53) [7]

2Vovan#1:

>Requirements
>Windows NT/2000/XP/Vista: Included in Windows 2000 and later.
>Windows 95/98/Me: Included in Windows 98 and later.
>Header: Declared in Wingdi.h; include Windows.h.
>Library: Use Msimg32.lib.

Под понятие "честный WinApi" это немножко не подходит. Мне так думается что лучше потратить пару часов и написать свой блит, чем завышать требования к программе.


 
Vovan#1   (2006-08-22 14:19) [8]

>Requirements

По твоим же словам следует, что требования - Win 98 и выше. Это высоко? Забыли 95-ый?


 
Don Nikola ©   (2006-08-22 16:08) [9]

>По твоим же словам следует, что требования - Win 98 и выше. Это высоко? Забыли 95-ый?

Ага ;)



Страницы: 1 вся ветка

Текущий архив: 2007.07.08;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
6-1159720721
_Anwy_
2006-10-01 20:38
2007.07.08
Авторизация на сайте с помощью IdHTTP


11-1164721449
KingMidas
2006-11-28 16:44
2007.07.08
Неправильная отрисовка прозрачности в KOLPng


2-1181918880
deras
2007-06-15 18:48
2007.07.08
Как "очистить" датасет?


11-1163962193
Vladimir Kladov
2006-11-19 21:49
2007.07.08
Версия 2.43


15-1181125978
Nic
2007-06-06 14:32
2007.07.08
Nokia 6080