Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

DNK
I. DNK
Баллы: 5

Подробнее »



Вопрос # 1 720

Раздел: Delphi » Прочее
/ вопрос решён /

Доброго времени суток, уважаемые эксперты!

У меня тут возникла такая проблемка, я не знаю как проверить былали загружена картинка в форму, а из за этого у меня весь мой процесс прирывается. например у меня в форму грузятся только jpg картинки, а если фаил с именем image.jpg на самом деле является файлом image.gif то выдает ощибку: JPEG error #54

Приложение:
  1. if FileName = '*.jpg' then
  2. begin
  3. !!!_Form1.Image1.Picture.LoadFromFile(cDir + SearchRec.Name);_!!!!!
  4.  
  5. W := Form1.Image1.Picture.Width;
  6. H := Form1.Image1.Picture.Height;


Mlex Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Mlex (статус: Посетитель)
Вопрос отправлен: 23 июня 2008, 15:50
Состояние вопроса: решён, ответов: 3.

Ответ #1. Отвечает эксперт: ANBsoft

Здравствуйте, Max no!
Саму загрузку картинки поместить в блок try - except.
Таким образом можно будет отследить появление ошибки и обработать ее.
Успехов.

Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 23 июня 2008, 16:05
Оценка за ответ: 5

Комментарий к оценке: в блок try? а как обработать ощибку?

Ответ #2. Отвечает эксперт: Feniks

Здравствуйте, Max no!
У любого графического файла есть служебные заголовки, обычно это первые 15 байт. У JPG-файла это JFIF начиная с 7 байта включительно. Следовательно, перед тем как загрузать файл на форму можно его проверить по этому заголовку. Берете для этого TFileStream.

var
   fs:TFilestream;
begin
   fs := TFileStream.create("имя файла.jpg", fmOpenRead);
   fs.position  := 7;//спозиционировать указатель чтения на начало метки
   fs.read(buffer, 5);//читать в буфер
// теперь buffer содержит эту метку, остается только ее проверить с нужной. Это я оставляю за вами...
// и если он совпадает, грузим картинку куда надо.
   fs.free; //закрыть файл
end;

Желаю удачи.

Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 23 июня 2008, 16:10
Оценка за ответ: 5

Ответ #3. Отвечает эксперт: min@y™

Добавлю ещё от себя: первые 3 байта JPEG-файла - это FF D8 FF. Можно проверять их наличие.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 24 июня 2008, 08:16


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 23 июня 2008, 17:13; участников в обсуждении: 4.
Mlex

Mlex (статус: Посетитель), 23 июня 2008, 16:08 [#1]:

в блок try? а как обработать ощибку?
Feniks

Feniks (статус: Бакалавр), 23 июня 2008, 16:15 [#2]:

try
// тут выполныем нужные действия, и если будет ошибка, то выполнение прерывается и передается управление в блок except
except
// тут выполняются операторы после возникновения исключительной ситуации
end;
Все это есть в хелпе и в любой книге.
Mlex

Mlex (статус: Посетитель), 23 июня 2008, 16:22 [#3]:

а надо что то в uses добавлять, а то он мне подсвиечивает ошибку: buffer ?
ANBsoft

ANBsoft (статус: Студент), 23 июня 2008, 16:51 [#4]:

Buffer место в памяти, куда будут грузиться данные.
Идея в том, что стандартный JPG имеет определенный заголовок (с 7 позиции идет "JFIF", но это не всегда, посмотрел файлы созданные фотоаппаратами, там "c8EExif" начиная с 4 позиции (Олимпус и панасоник).
Feniks

Feniks (статус: Бакалавр), 23 июня 2008, 16:53 [#5]:

TFileStream прекрастно описан в хелпе.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 23 июня 2008, 17:13 [#6]:

Учтите, что призапуске программы из под Delphi, сообщение об ошибке будет все равно показываться, независимо от наличия try except. Чтобы избежать этого, надо в опциях компиляторя (Debugger Options) отключить Stop on Delphi Exception. Если запускать exe, то сообщение об ошибке (при наличии try except) не показывается

31 января 2011, 20:03: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 21 августа 2017, 13:11
Выполнено за 0.04 сек.
Рейтинг@Mail.ru