Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> баг с LoadFromFile 128x128 bmp ? 
:(
    Опции темы
Sep.
Дата 18.8.2004, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 22.7.2004

Репутация: нет
Всего: 6



натолкнулся на такую ошибку в своей delphi 6, имеется любой код типа:
Код
   Bmp := TBitmap.Create;
   Bmp.LoadFromFile(opendialog1.Filename);
   form1.Canvas.Draw(0,0,bmp);

так вот если ему подсовываешь bmp сохраненную photoshop cs8 или 6, любую 16bit или 24 или 32, но с размером 128х128 пикселей - то выдается ошибка stream read error.
Причем если эту картинку пересохранить 7ым фотошопом или IrfunView то все открывается нормально. Причем походу это только с 128х128 картинками.
Вот, если у вас нету фотошопа cs можете взять здесьтакую bmp приколоться =)
Приходится перед этим открывать файл как file of byte и менять байтики. Может можно как нибудь более изящно этот баг обойти? Через bmp.loadfromstream тоже пробовал =(
--------------------
Syn - TotalCommander lister plugin |  SynTree - coders sourcebook  
PM MAIL   Вверх
Illusion Dolphin
Дата 18.8.2004, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 13
Всего: 63



Хм... интересный глюк... Присоединяюсь к вопросу... наверное, ошибка с записью заголовка в фотошопе... Но учитывая то, что стандартный mspaint его открывает, то, возможно, что borland что-то не учёл в своих исходниках... какие-нибудь новые тенденции...


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 19.8.2004, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Это из-за того, что PhotoShop сохраняет файл с немного большим размером, чем нужно (лишние нулевые байты в конце...), и это отражается в biSizeImage.
TBitmap.ReadDIB вызывает API-функцию CreateDIBSection, которая выделяет память в соответствии с параметрами битмапа (ширина, высота, битов на пиксел...). В случае 128x128x24, под ppvBits отводится системой $C000 байт, а в сохранённой в PS картинке biSizeImage = $C002 байта (из-за лишних двух нулей в конце), и когда потом TBitmap.ReadDIB делает чтение в ppvBits $C002 байт, происходит ошибка... При других размерах не возникает ошибки из-за того, что память всё равно выделяется страницами по 4кб, так что заезд за пределы был некритичен.
Я обходил этот баг так:
Код
procedure AntibugLoadBmp (bmp : TBitmap; const FileName : string);
var ms : TMemoryStream;
begin
 ms := TMemoryStream.Create;
 ms.LoadFromFile(FileName);
 PBitmapInfoHeader(DWORD(ms.Memory) + SizeOf(BITMAPFILEHEADER))^.biSizeImage := 0;
 bmp.LoadFromStream(ms);
 ms.Free;
end;

Смысл в том, что если присвоить biSizeImage нулевое значение, TBitmap.ReadDIB сама посчитает biSizeImage:
Код
// biSizeImage can be zero. If zero, compute the size.
if biSizeImage = 0 then            // top-down DIBs have negative height
 biSizeImage := BytesPerScanLine(biWidth, biBitCount, 32) * Abs(biHeight);



--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0435 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.