Перейти к содержанию
Fire Monkey от А до Я
  • 0

Загрузка картинки в TBitmap из TResourceStream


HoShiMin

Вопрос

Загружаю картинку в TBitmap из TMemoryStream, но иногда в TBitmap копируется только часть картинки. Загружаю следующим кодом:

var
  ResourceStream: TResourceStream;
  Bitmap: TBitmap;
begin
  ResourceStream := TResourceStream.Create(hInstance, 'IMAGE_NAME', RT_RCDATA);
  ResourceStream.Position := 0;
  Bitmap.LoadFromStream(ResourceStream);
 
  ResourceStream.SaveToFile('img_res.png');
  Bitmap.SaveToFile('img_bitmap.png');
 
  FreeAndNil(ResourceStream);
end;

В итоге в img_res.png нормальное изображение, а в img_bitmap.png первые N байт оригинала, при одинаковом размере картинки N одинаковое. С TMemoryStream аналогично.

Как исправить?

Изменено пользователем HoShiMin
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

        Посмотрел у себя  проблем не было делаю так:

.....

   pi := TresourceStream.Create(0, 'neoplach',
                        PChar(RT_RCDATA));
                      imageo[i].LoadFromStream(pi);
                      pi.Free; 

может instance? ))) И курсор я не перевожу, а картинки большие?

....

Изменено пользователем Syb
Ссылка на комментарий
  • 0

        Посмотрел у себя  проблем не было делаю так:

.....

   pi := TresourceStream.Create(0, 'neoplach',
                        PChar(RT_RCDATA));
                      imageo[i].LoadFromStream(pi);
                      pi.Free; 

может instance? ))) И курсор я не перевожу, а картинки большие?

....

Картинки в пределах 50 Кб, с hInstance'ом всё нормально. В большинстве случаев всё грузится нормально, но иногда копируется только пара сотен первых байт оригинала.

Ссылка на комментарий
  • 0

Это с одним и тем же ресурсом происходит( картинкой) в одном потоке и под win32?

Один поток, один и тот же ресурс, и под Win32, и под Win64. И ещё раз уточню - это происходит не всегда, а достаточно редко. Причём проблема именно с заполнением битмапа из TStream'a (из любого), а не именно с TResourceStream.

Ссылка на комментарий
  • 0

 

Это с одним и тем же ресурсом происходит( картинкой) в одном потоке и под win32?

Один поток, один и тот же ресурс, и под Win32, и под Win64. И ещё раз уточню - это происходит не всегда, а достаточно редко. Причём проблема именно с заполнением битмапа из TStream'a (из любого), а не именно с TResourceStream.

 

Может проблема не в заполнении битмапа из ресурса, а в сохранении битмапа в файл? Из первого Вашего сообщения вроде следует второй вариант.

Может быть проблема в том, что Вы сохраняете битмап в png?

Попробуйте подключить модуль FMX.Types, если еще не подключен. Там есть класс TBitmapCodecManager, предназначенный для конвертирования изображений в разные форматы. Подробнее в книге Осипова "Программирование для Windows, OS X, iOS и Android" на 236 стр.

Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 0
  • Модераторы

в fmx проблема с картинками, у меня ни разу не получилось из ресурсов вытащить файл (png к слову сказать).

вообще xx.Bitmap кушает все форматы зарегистрированные в среде. с этим проблем не должно быть. а вот само хранение вызывает интерес.

я поступил по другому, закинул картинки в Deployment и проблема пропала

Ссылка на комментарий
  • 0

в fmx проблема с картинками, у меня ни разу не получилось из ресурсов вытащить файл (png к слову сказать).

вообще xx.Bitmap кушает все форматы зарегистрированные в среде. с этим проблем не должно быть. а вот само хранение вызывает интерес.

я поступил по другому, закинул картинки в Deployment и проблема пропала

Много раз вытаскивал Png из ресурсов, проблем не замечено.

Например загрузка 40 изображений с именами "PngImage_1"..."Png_Image_40" в массив

    for n:=0 to 39 do begin
        rs:=TResourceStream.Create(0,'PngImage_'+inttostr(n+1),PChar(RT_RCDATA));
        setlength(img,n+1); img[n]:=tbitmap.Create; img[n].LoadFromStream(rs); rs.Free;
    end;
Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 0

Может быть проблема в том, что Вы сохраняете битмап в png?

Попробуйте подключить модуль FMX.Types, если еще не подключен. Там есть класс TBitmapCodecManager, предназначенный для конвертирования изображений в разные форматы. Подробнее в книге Осипова "Программирование для Windows, OS X, iOS и Android" на 236 стр.

 

По сети программа получает картинку в png (грузится в TMemoryStream), оттуда загружается во временный TBitmap, из которого потом грузится в TImage на форме. И в промежуточном Bitmap'е она время от времени бьётся: не отрисовывается на форме, а при сохранении получаю лишь несколько первых байт оригинальной картинки, которая в целости и сохранности лежит в TMemoryStream. Метод LoadFromStream в TBitmap'е как раз реализован через BitmapCodecManager, поэтому "ручная" конвертация проблему не решит, ибо получится то же самое.

Меня больше смущает то, что бьётся не всегда, а довольно редко. При этом другие потоки не пытаются получить доступ к промежуточному битмапу, скопировать картинку никто не мешает.

 

С TResourceStream то же самое. Иногда не грузится из него картинка. И если с ним можно замаскировать проблему, закинув картинки в Deployment, то с TMemoryStream так не получится, т.к. картинки приходят по сети.

Изменено пользователем HoShiMin
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...