Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.03.2009, 09:39
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию загрузка изображения из ресурсов

Доброго времени суток, решаю проблему загрузки изображения из ресурсов, создал файл ресурсов содержащий битмап (24 бит цвет),
при попытке загрузить его возникает ошибка Bitmap image is not valid при jpeg тоже самое
Исходый код взял с Delphi World тк Win Api начал изучать недавно :

Код:
unit load_res;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Buttons;
type
  TForm1 = class(TForm)
    Image1: TImage;
    BitBtn1: TBitBtn;
    procedure FormCreate(Sender: TObject);
   // procedure FormPaint(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
 DLLInstance:THandle;
implementation
{$R *.dfm}
 {$R uuu.rec}
procedure TForm1.BitBtn1Click(Sender: TObject);
const
  BM = $4D42; {Идентификатор типа изображения}
var
  Bmp: TBitmap;
  BMF: TBitmapFileHeader;
  HResInfo: THandle;
  MemHandle: THandle;
  Stream: TMemoryStream;
  ResPtr: PByte;
  ResSize: Longint;
begin
  BMF.bfType := BM;
  
  HResInfo := FindResource(HInstance, 'название изображения', RT_Bitmap);
  MemHandle := LoadResource(HInstance, HResInfo);
  ResPtr := LockResource(MemHandle);

  {Создаем Memory-поток, устанавливаем его размер, записываем
  туда заголовок изображения и, наконец, само изображение }
  Stream := TMemoryStream.Create;
  ResSize := SizeofResource(HInstance, HResInfo);
  Stream.SetSize(ResSize + SizeOf(BMF));
  Stream.Write(BMF, SizeOf(BMF));
  Stream.Write(ResPtr^, ResSize);

  {Освобождаем поток и сбрасываем его позицию в 0}
  FreeResource(MemHandle);
  Stream.Seek(0, 0);

  {Создаем TBitmap и загружаем изображение из MemoryStream}
  Bmp := TBitmap.Create;
  Bmp.LoadFromStream(Stream);
  Canvas.Draw(0, 0, Bmp);
  Bmp.Free;
  Stream.Free;
end;
end.


Ответить с цитированием
  #2  
Старый 24.03.2009, 10:05
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Зачем так сложно?
Вот работающий код:
Код:
{$R uuu.res}

procedure TForm1.Button1Click(Sender: TObject);
var
   MyBmp: TBitmap;
begin
  MyBmp := TBitmap.Create;
  try
    MyBmp.LoadFromResourceName(HInstance, 'MY_BMP');
    Image1.Picture.Assign(MyBmp);
//    Canvas.Draw(10, 10, MyBmp); или так, если картинка должна быть на форме
  finally
    MyBmp.Free;
  end;
end;
Текстовый файл для компиляции ресурса:
MY_BMP BITMAP "uuu.bmp"
Проверено на картинке с глубиной цвета 24 бит.

Особенность. Наименование ресурса должно быть заглавными буквами и в текстовом файле и при указании в параметрах процедуры загрузки ресурса.
К DelphiWorld следует относится настороженно: там много ошибок и не работающего кода
__________________
Не забывайте делать резервные копии

Последний раз редактировалось san-46, 24.03.2009 в 10:18.
Ответить с цитированием
  #3  
Старый 24.03.2009, 11:14
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию

Спасибо большое!!! И действительно это не первый мой случай проблем с кодами этого сайта
Ответить с цитированием
  #4  
Старый 04.10.2010, 18:43
buld3r buld3r вне форума
Прохожий
 
Регистрация: 04.10.2010
Сообщения: 1
Репутация: 10
По умолчанию Проблема с файлом.

Цитата:
Сообщение от san-46
Зачем так сложно?
Вот работающий код:
Код:
{$R uuu.res}

procedure TForm1.Button1Click(Sender: TObject);
var
   MyBmp: TBitmap;
begin
  MyBmp := TBitmap.Create;
  try
    MyBmp.LoadFromResourceName(HInstance, 'MY_BMP');
    Image1.Picture.Assign(MyBmp);
//    Canvas.Draw(10, 10, MyBmp); или так, если картинка должна быть на форме
  finally
    MyBmp.Free;
  end;
end;
Текстовый файл для компиляции ресурса:
MY_BMP BITMAP "uuu.bmp"
Проверено на картинке с глубиной цвета 24 бит.

Особенность. Наименование ресурса должно быть заглавными буквами и в текстовом файле и при указании в параметрах процедуры загрузки ресурса.
К DelphiWorld следует относится настороженно: там много ошибок и не работающего кода

А можно меня просветить куда надо кидать файл, а то полный ноль в этом деле. Кинул его на рабочий стол, с названием MY_BMP, он мне его в упор найти не может.
Ответить с цитированием
  #5  
Старый 04.10.2010, 18:49
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию

Цитата:
Сообщение от buld3r
А можно меня просветить куда надо кидать файл, а то полный ноль в этом деле. Кинул его на рабочий стол, с названием MY_BMP, он мне его в упор найти не может.
Файл должен находиться в папке проекта
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:47.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter