Текущий архив: 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