Delphi> Могу ли я сохранить растровые данные в моем устройстве (не в dfm)? - PullRequest
1 голос
/ 03 ноября 2010

У меня есть класс, объявленный в модуле, и он должен работать с определенным растровым изображением.Это заявлено в DFM моего тестового устройства следующим образом:

  object ImgTop: TImage
    Left = 208
    Top = 568
    Width = 777
    Height = 41
    Picture.Data = {
      0A544A504547496D616765A1CF0000FFD8FFE000104A46494600010101025802
      [truncated]
      };

Но в моем последнем модуле у меня не будет DFM.Так есть ли способ, которым я могу объявить это в моем блоке?

===

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

В моей папке этиfiles:

imgleft.bmp
imgtop.bmp

Это мой файл ресурсов с именем ScanOCRres.rc:

1 RT_BITMAP "imgtop.bmp"
2 RT_BITMAP "imgleft.bmp"

Я настроил его автоматическое выполнение с C: \ Program Files \ Borland \ Delphi 7 \ bin\ brcc32.exe

Он сгенерировал файл

ScanOCRres.RES

В моем модуле у меня есть реализация

{$R *.dfm}
{$R ScanOCRres.RES}

А вот мой код:

var
  abmp : TBitmap;
begin
  abmp := TBitmap.create;
  abmp.LoadFromResourceID(SysInit.HInstance, 1);
  abmp.free;
end;

Я получаю это сообщение об ошибке в строке LoadFromResourceID:

Project Project1.exe поднял класс исключения EAccessViolation с сообщением «Нарушение доступа по адресу 0040A2C8 в модуле« Project1.exe ». Чтение адреса 00000001

Ответы [ 2 ]

7 голосов
/ 03 ноября 2010

Вы могли бы вставить это в свой код, но работать с ним было бы не очень удобно. Объявите массив байтов и определите каждый байт вашего изображения. Удачи в редактировании. Чтобы загрузить его, я бы обернул байтовый массив в TMemoryStream, а затем использовал LoadFromStream.

Лучший способ - сохранить изображение в ресурсе . Напишите файл сценария ресурса следующим образом:

1 RT_BITMAP "foo.bmp"

Добавьте этот файл .rc в ваш проект Delphi, и он будет автоматически связан с вашей программой. Во время выполнения загрузите изображение с TBitmap.LoadFromResourceId:

var
  b: TBitmap;
begin
  b := TBitmap.Create;
  b.LoadFromResourceId(SysInit.HInstance, 1);
0 голосов
/ 03 ноября 2017

Я сделал это. Это грубо, но это работает. Преобразует изображение компонента в файл picture.data в виде строки.

Procedure ImgToText(Com : TComponent; var str : AnsiString);
var i,c : integer;
s : tmemorystream;
b : byte;
t : array[0..3] of char;
ch : char;
begin
 s := tmemorystream.Create;
 s.WriteComponent(com);
 s.Position := 0;
 c := 0;
 repeat
  s.Read(ch,1);
  if ch = '.' then
  begin
   s.Read(t,4);
   if t = 'Data' then
    c := s.Position+5;
  end;
 until c <> 0;
 s.Position := c;
 str := '';
 i := c;
 c := 0;
 repeat
  s.ReadBuffer(b,1);
  str := str+inttohex(b,2);
  c := c+2;
  if c >= 64 then
  begin
   str := str+#13+#10;
   c := 0;
  end;
  i := i+1;
 until i = s.Size-2;
 s.Free;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...