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

Вниз

Загрузка BMP   Найти похожие ветки 

 
Sphinx   (2004-11-06 20:29) [0]

Пытаюсь собрать свой файл ресурсов, в котором будет хранитсья BMP картинка.
Далаю это так.

есть следующий юнит:

unit EngineClasses;

interface

type
 TResHeader = record
   Name:     String[5];  // описание формата файла
   Version:  Byte;       // версия заголовка
 end;

implementation

end.


так же юнит по работе с изображениями:

unit UnitPic;

interface
uses
 SysUtils,
 Windows,
 EngineClasses;

function LoadBitMap24File(const WHandle: THandle; FileName: String; out BMap: HBitmap): HResult;
function LoadBitMap24Res(HBmp: HBitMap; DestHandle: THandle):HResult;

implementation

function LoadBitMap24File(const WHandle: THandle;   // указатель на окно приложения
                     FileName: String;             // путь к файлу с изображением
                     out BMap: HBitmap): HResult;  // указатель на bitmap -
                                                   // выходной параметр
var
 HBMap:            HBitMap;            // указатель на структуру изображения
 FileHeader:       TResHeader;         // заголовок файла ресурсов
 F:                File;               // собственно файл
 BitmapFileHeader : TBITMAPFILEHEADER;
 BitmapInfoHeader: TBITMAPINFOHEADER;  // заголовок информации об изображении
 BitmapInfo:       TBitMapInfo;        // ***********************************
 BitmapBits:       Pointer;            // указатель на массив с хранимым изображением
 ReadCount:        DWORD;              // счетчик чтения
 DC:               HDC;                // контекст устройства
 LogFile:          TextFile;
begin
 // первоначальный результат - отрицательный
 Result:=S_FALSE;
 // проверка существования файла
 if not(FileExists(FileName)) then
   Exit;
 // открываем файл
 AssignFile(F, FileName);
 // указываем что открыт для чтения
 Reset(F, 1);

 AssignFile(LogFile, "log.txt");
 Rewrite(LogFile);

 // читаем заголовок
 BlockRead(F, FileHeader, SizeOf(TResHeader), ReadCount);

 // если считалось что-то отличное от заголовка
 if ReadCount<>SizeOf(TResHeader) then
   begin
     CloseFile(F);
     WriteLn(LogFile, "Не считан заголовок");
     CloseFile(LogFile);
     Exit;
   end;
 // считанный ресурс не является созданным для данного приложения
 if FileHeader.Name<>ResName then
   begin
     CloseFile(F);
     WriteLn(LogFile, "Неверное имя ресурса");
     CloseFile(LogFile);
     Exit;
   end;
 // несовпадают версии ресурсов
 if FileHeader.Version<>ResVersion then
   begin
     CloseFile(F);
     WriteLn(LogFile, "Неверная версия ресурса");
     CloseFile(LogFile);
     Exit;
   end;

BlockRead(F, BitmapFileHeader, SizeOf(TBitmapFileHeader), ReadCount);
if (ReadCount <> SizeOf(TBitmapFileHeader)) then
begin
     CloseFile(F);
     WriteLn(LogFile, "Неверный заголовок файла ");
     CloseFile(LogFile);
     Exit;
end;

 // считываем заголовок изображения
 BlockRead(F, BitmapInfoHeader, SizeOf(TBitmapInfoHeader), ReadCount);
 // если считалось что-то отличное от заголовка изображения
 if ReadCount<>SizeOf(TBitmapInfoHeader) then
   begin
     CloseFile(F);
     WriteLn(LogFile, "Неверный заголовок картинки");
     CloseFile(LogFile);
     Exit;
   end;
 // выделение памяти под изображение
 GetMem(BitmapBits, BitmapInfoHeader.biSizeImage);
 // читаем изображение
 BlockRead(F, BitmapBits^, BitmapInfoHeader.biSizeImage, ReadCount);
 // если считанно что-то отличное от изображения
 if (ReadCount<>BitmapInfoHeader.biSizeImage) then
   begin
     CloseFile(F);
     WriteLn(LogFile, "считанно что-то отличное от изображения");
     CloseFile(LogFile);
     Exit;
   end;
 // создаем из всего считанного изображение в памяти
 BitmapInfo.bmiHeader:=BitmapInfoHeader;
 DC:=GetDC(WHandle);
 HBMap:=CreateDIBitmap(DC,
                       BitmapInfoHeader,
                       CBM_INIT,
                       BitmapBits,
                       BitmapInfo,
                       DIB_RGB_COLORS);
 ReleaseDC(WHandle, DC);
 // если получилось пустое изображение
 if HBMap=0 then
   begin
     CloseFile(F);
     WriteLn(LogFile, "пустое изображение");
     CloseFile(LogFile);
     Exit;
   end;
 // передаем результат
 BMap:=HBMap;
 // закрываем файл
 CloseFile(F);
 CloseFile(LogFile);
 // если все прошло успешно
 Result:=S_OK;
end;

function LoadBitMap24Res(HBmp: HBitMap; DestHandle: THandle):HResult;
var
 HDCImg:       HDC;
 Bmp:          BitMap;
//  Res:          LongBool;
 x, y, dx, dy: Integer;
begin
 Result:=S_FALSE;
 if DestHandle=0 then Exit;
 HDCImg:=CreateCompatibleDC(0);
 if HDCImg=0 then Exit;
//  SelectObject(HDCImg, HBmp);
 GetObject(HBmp, sizeof(Bmp), @Bmp);
 x:=0;
 y:=0;
 dx:=Bmp.bmWidth;
 dy:=Bmp.bmHeight;
 BitBlt(DestHandle, x, y, dx, dy, HDCImg, 0, 0, SRCCOPY);
 DeleteDC(HDCImg);
 Result:=S_OK;
end;

end.


и в программе записан следующий текст:

procedure TForm1.Button1Click(Sender: TObject);
var
 Bmp:        TBitMap;
 OutStream:  TStream;
 BmpStream:  TStream;
 ResHeader:  TResHeader;
begin
 if Edit3.Text="" then Exit;
 Bmp:=TBitmap.Create;
 OutStream:=TFileStream.Create(Edit3.Text, fmCreate);
 BmpStream:=TMemoryStream.Create;

 ResHeader.Name:=ResName;
 ResHeader.Version:=ResVersion;

 BmpStream.Position:=0;
 Bmp.LoadFromFile(Edit1.Text);
 Bmp.SaveToStream(BmpStream);

 OutStream.Position:=0;
 OutStream.WriteBuffer(ResHeader, SizeOf(TResHeader));
 BmpStream.Position:=0;
 OutStream.CopyFrom(BmpStream, BmpStream.Size);
//  OutStream.

 Bmp.Free;
 BmpStream.Free;
 OutStream.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 HBMP: HBITMAP;
begin
 if Edit2.Text="" then Exit;
 if LoadBitMap24File(Form2.Canvas.Handle, Edit2.Text, HBMP)=S_OK then
   begin
     Form2.Show;
     LoadBitMap24Res(HBMP, Form2.Canvas.Handle);
   end;
end;


Так вот, Form2 создается, но изображение пустое. Может кто подскажет где ошибка?

Заранее спасибо.


 
Sphinx   (2004-11-06 20:33) [1]

Извеняюсь, забыл описать.

> procedure TForm1.Button1Click(Sender: TObject);
Для создания ресурса.

> procedure TForm1.Button2Click(Sender: TObject);
Для проверки правильности компановки.

Ресурс создается верно, проверял.


 
Sphinx   (2004-11-07 21:59) [2]

Кхммм...извеняюсь....но Up :)


 
cyborg ©   (2004-11-08 08:43) [3]

Repaint форме или канвасу наверное нужно сделать, не знаю.

А вот это LoadBitMap24Res(HBMP, Form2.Canvas.Handle); разве рисует на канвасе?


 
cyborg ©   (2004-11-08 08:49) [4]

Не силён в API, но вот это не понятно
HDCImg:=CreateCompatibleDC(0);
а потом используется
BitBlt(DestHandle, x, y, dx, dy, HDCImg, 0, 0, SRCCOPY);
Что это такое? Чего-то нулевое создаёшь, потом используешь, может тут причина?


 
Sphinx   (2004-11-08 09:38) [5]

> cyborg ©   (08.11.04 08:49) [4]

> Не силён в API

В том-то и дело что я тоже :) а эта строка взята из одного примера, собственно по которому и переписывал свой код.
Спасибо, проверю что вы посоветовали, а то свои мысли закончились уже :(


 
NikeOLD ©   (2004-11-08 11:32) [6]


> HDCImg:=CreateCompatibleDC(0);

Видишь ли, контекст устройства (твой DC) - это по сути битмап. Однако для того, чтобы иметь возможность на нем рисовать необходимо сначала выбрать битмап и поместить его в контекст, иначе отрисовки не будет.
SelectObject(HDCImg, <Handle битмапа, который будет служить в DC для рисования>);

А вообще придется долго читать SDK, т.к. не все так просто.


 
Sphinx   (2004-11-08 20:31) [7]

> SelectObject(HDCImg, <Handle битмапа, который будет служить
> в DC для рисования>);

Это есть...только по глупости зачем-то закоментировал

> //  SelectObject(HDCImg, HBmp);

Убрал коментарий...и наслаждаюсь квадрадом Малевича вместо картинки. Отсюда вопрос...как можно проверить правильность загрузки картинки?

> А вот это LoadBitMap24Res(HBMP, Form2.Canvas.Handle); разве
> рисует на канвасе?

По идее должна, в примере из которого писал все работает, одна проблема, там сразу происходит загрузка на поверхности DX, а мне нужно сделать самый простой аналог TBitmap - только для хранения в нем картинки, загрузки её из файла и всё...


 
NikeOLD ©   (2004-11-09 09:22) [8]

Долго изучал, сам когда-то подобное делал и все работало. Но мне надо было сразу на поверхности DD заливать, поэтому и не заморачивался особо.
Но та функция, что обеспечивала заливку на поверхности использовала StrechBlt. Попробуй ее, возможно проблема из-за несоотвествия размеров.
А так код вроде бы правильный.



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

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

Наверх




Память: 0.5 MB
Время: 0.027 c
4-1103866801
Дмитрий Александрович
2004-12-24 08:40
2005.02.13
Узнать сколько байт (бит) программы загружено в память.


11-1084949258
RTWolf
2004-05-19 10:47
2005.02.13
Почему нет символа "_" ?


1-1106737496
Vn
2005-01-26 14:04
2005.02.13
Мигание иконки на панели задач


1-1106918647
Drakosha
2005-01-28 16:24
2005.02.13
Помогите выявить повторения....


4-1103566714
sashas
2004-12-20 21:18
2005.02.13
Получение сообщения WM_MOUSELEAVE