Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.11.06;
Скачать: [xml.tar.bz2];

Вниз

JPEG error + on E: Exception   Найти похожие ветки 

 
SIV5000   (2011-07-12 16:36) [0]

Народ привет. Подскажите пожалуйста как обработать Exception при загружке попорченого JPEG файла (exception class EJPEG with message "JPEG error #42".).
Кажеться правильно но что интересно так ето то что ошибка возникает не при  JPG.LoadFromFile а при Image1.Picture.Assign.

var
JPG:TJpegImage;
begin
JPG:= TJpegImage.Create;
JPG.LoadFromFile("C:\Sony\DSC05107.jpg");
try
 Image1.Picture.Assign(JPG);  
 except
 on E: Exception do begin
   JPG.free;
  end;
 end;
JPG.free;
end;


 
MBo ©   (2011-07-12 16:40) [1]

в данном случае не видно, чтобы какие-то особые действия при исключения делались, так что try-finally будет разумно использовать.


 
Юрий Зотов ©   (2011-07-12 16:41) [2]


JPG:= TJpegImage.Create;
try
 JPG.LoadFromFile("C:\Sony\DSC05107.jpg");
 Image1.Picture.Assign(JPG);  
finally
 JPG.free;
end;


 
SIV5000   (2011-07-12 20:48) [3]


> в данном случае не видно, чтобы какие-то особые

Ну это так, упрощенный вариант, самая "Суть"


> Юрий Зотов

Нифига. JPG то освобождаеться, но выдает окно с "JPEG error #42". Окно то и должно по идее в "except  on E: Exception" не появляться (что мне и надо).
Просто уже есть похожий код для обаботки иконки но там Exception  перехватываеться и все ОК. А с .jpg какая то фигня. Вот с иконками Exception  выплывает сразу после неудачной загрузки а с .jpg только когда Assign.
Может виноват TImage, но тут он просто для примера а на самом деле использую TBitmap.Assign(TJpegImage). Итам тот же результат !!!
Так как же ето сделать???


 
DVM ©   (2011-07-12 21:01) [4]


> Вот с иконками Exception  выплывает сразу после неудачной
> загрузки а с .jpg только когда Assign.

декодирование происходит в этот момент вероятно, а до этого момента JPEG данные просто лежат в Stream


 
SIV5000   (2011-07-12 22:59) [5]

Короч. Заметил что глюк этот только (пока что) с "JPEG error #42". С другими ошибками не наблюдаеться.
Експеремент:
Открываю блокнот и сохраняю текстовой файл с расширением .jpg (пусть будет 000.jpg)

Вот такой вариант кода работает если ошибка "JPEG error #53"
var
JPG:TJpegImage;
begin
JPG:= TJpegImage.Create;
 try
  JPG.LoadFromFile("C:\Sony\000.jpg"); но возникает Exception здесь, при загрузке, а при ошибке #42 - в следующей строчке
  Image1.Picture.Assign(JPG);
  except
   on E:Exception do begin
    JPG.LoadFromFile("D:\Pictures\Films\ph-10167.jpg");
    Image1.Picture.Assign(JPG);
    end;
   end;
  JPG.Free;
end;

Так как же отловить это?
Могу скинуть ту попорченую картинку с примером, если поможет.


 
Andy BitOff ©   (2011-07-12 23:19) [6]

> Так как же отловить это?

http://www.codenet.ru/progr/formt/jpeg_13.php


 
Юрий Зотов ©   (2011-07-13 13:21) [7]

> SIV5000   (12.07.11 20:48) [3]

> Окно то и должно по идее в "except  on E: Exception" не появляться (что мне и надо).

Прятать ошибки - это ОЧЕНЬ плохая практика.


 
Slym ©   (2011-07-14 08:42) [8]

не нравится - юзай другое и быстрее и менее глючно
http://software.intel.com/en-us/articles/intel-integrated-performance-primitives-intel-ipp-jpeg-sample-and-performance-faqs/


 
SIV5000   (2011-07-14 11:30) [9]


> Юрий Зотов - Прятать ошибки - это ОЧЕНЬ плохая практика.


Ну почему же прятать ОШИБКИ? Я хочу спрятать окно Exception а ошибку конечно же обработать.
Спасибо за помощь, но нашел самый простой способ  - просто проверить ширину или высоту JPG. У попорченого JPG W или H = 0.


 
Юрий Зотов ©   (2011-07-14 23:03) [10]

> SIV5000   (14.07.11 11:30) [9]

> У попорченого JPG W или H = 0.

Откуда такая уверенность? От того, что Вы проверили это на несчастном десятке попорченных файлов? Но это же ничего не доказывает (тем более, если весь этот десяток Вы делали одним и тем же способом - в блокноте).

Завтра запросто встретится попорченный файл с ненулевыми W и H - и что тогда делать бедняге программе?

Признаком попорченного файла является не W=0 и не H=0. Им является сам факт возникновения исключения. Поэтому не надо ничего проверять - надо поймать исключение и выдать понятное человеку сообщение. И еще надо  позаботиться, чтобы при этом не было утечки памяти.

А больше НИЧЕГО делать не нужно.


 
SIV5000   (2011-07-15 00:48) [11]


> Юрий Зотов

Да я с Вами согласен что ситуации бывают разные. Может немного не так написал, но W = 0 и  H = 0 я имел в виду именно у попорченого файла а не у того который был "сделан" в блокноте.
Просто как я уже обьяснял, и для чего делал такой експеримент, так просто что б наглядно показать что почему то  "JPEG error #53" возможно обработать в Exception а "JPEG error #42" нет. Вот и по этому спрашиваю ПОЧЕМУ ТАК????

Ну а уже методом "втыка" получилось эту проблему хоть как то решить.


> надо поймать исключение и выдать понятное человеку сообщение


Вот как раз таки не надо ничего выдавать! Поймать, обработать так что б прога не зависла. Да, может в некоторых програмах это нужно, но только в тех ситуациях где человеку это нужно знать (например аудио плеэр выдаст окно что попорчен аудио файл).
В моем варианте ничего выводить не надо, просто вместо попорченой картинки загрузить другую из ресурса, рисунок которой говорит что програма не может обработать файл.


 
Германн ©   (2011-07-15 01:59) [12]


> Просто как я уже обьяснял, и для чего делал такой експеримент,
>  так просто что б наглядно показать что почему то  "JPEG
> error #53" возможно обработать в Exception а "JPEG error
> #42" нет. Вот и по этому спрашиваю ПОЧЕМУ ТАК????

А я таки и не понял в чём разница между этими ошибками?
Какая нафиг разница в какой строке защищённого блока возникает исключение?


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

А почему программа не может обработать сей файл тебе не интересно.

Тебя бы, хотя бы на месяц сунуть в обычно-нормальную техподдержку! :)

P.S.
 Есть и другие варианты, кроме техподдержки. Стройбат, например. :)


 
SIV5000   (2011-07-15 12:51) [13]

Удалено модератором
Примечание: Выражения выбираем, не в пивной


 
Dennis I. Komarov ©   (2011-07-15 14:29) [14]


> Нифига. JPG то освобождаеться, но

А не подумал, что в блоке exeption тоже может быть исключение, а по сему Free не отработает - вот и утечка.
См. [2] и делай так всегда...
Взрослые дяди в голубых штанах говорят не делай так, так ведь нет...

З.Ы.
      Где же ИШ, я буду ленту подавать ;)


 
sniknik ©   (2011-07-15 14:30) [15]

>> А я таки и не понял в чём разница между этими ошибками?
> Ответ: НОМЕР ОШИБКИ.
он не дальтоник чтобы номера не различать... не понятны твои слова, в чем ТЫ видишь различия, что когда. и как, работает, а когда и как нет. в зависимости от номера.

> При одинаковом коде если возникает Exception с "JPEG error #53" то все возможно обработать а при этом же коде но при Exception с "JPEG error #42" ничего не получаеться?
вот вот, именно про это,  что значит "все возможно обработать", и что "ничего не получаеться"???

вот же в [5] написано  -
> Вот такой вариант кода работает если ошибка "JPEG error #53"
> ...
> JPG.LoadFromFile("C:\Sony\000.jpg"); но возникает Exception здесь, при загрузке, а при ошибке #42 - в следующей строчке
т.е. "все" работает, если речь все еще про обработку эксепта... разница только в том, что на разных строках.
но тут ничего удивительного, представь архив...(jpeg в какойто мере он и есть), пытаешься считать сам файл получаешь дисковую ошибку(нет доступа/порушен диск/...), после  пытаешься архив "развернуть" получаешь ошибку этого действия (порушена структура/не сошелся CRC/...).
в чем проблема то?

> никто не знает как
и не знаю, и знать не хочу... т.к. при правильной работе на это пофиг. никогда не возникнет нужда "вникать в нюансы".


 
SIV5000   (2011-07-15 16:08) [16]

Ну давайте сначала. Програма создает превюшки (Thumbnails) .JPG файлов.
Ясно? Думаю да.
Теперь. Бывают ситуации когда файлы тем или иным способом стают попорчеными. Тоесть либо не полностью скопированые либо комп выбило либо какой то чувак изменил расширение допустим .bmp на .jpg (не знаю почему, может небило что делать).
Ну это тоже должно быть понятно. Так что сюда думаю Вам не нужно возвращаться.
Переходим к обработке наших кртинок.

Допустим мы создали список картинок и начинаем загружать их по очереди, делать ресамплинг и сохранять уменьшеную копию картинки в наш ранее придуманый обьект.

Но, в процесе загрузки у нас возникает ошибка, прога подает последние признаки жизни в виде месседжа и "погибает".
Что же делать? Почему ей пришел каюк?
Причиной стал "попорченый" файл. Но "попорченым" он может быть как я уже выше писал ("либо не полностью скопированые либо комп выбило либо какой то чувак изменил расширение допустим .bmp на .jpg") .

Но какая именно ошибка, нам поможет Exception ведь для того он и нужен!!!

Что же делает Exception???
Exception дает нам шанс спасти нашу програму без перезапуска + Exception возникает при какой то КОНКРЕТНОЙ ситуации, а значит он ЗНАЕТ ЧТО ИМЕННО случилось и в своем месседже говорит:"JPEG error #53".

Немного поискав по нету можно узнать что "JPEG error #53" возникает когда файл с расширением .jpg имеет Header не JPEG файла. тоесть он не являеться  .jpg файлом.

Зная с чем мы столкнулись, что б не говорить юзеру: "Чувак! Не могу заргузить файл" каждый раз и выкидать кучу месседжов мы обрабатываем наш Exception вот так вот:

 on E:Exception do begin
  ну к примеру загружаем просто другую картинку или вообще игнорируем етот файл, если что то создавали раньше то освобождаем.
Ну Вы должны быть в курсе.
И САМОЕ ГЛАВНОЕ:   ПРОГА НЕ ВЫДАЕТ МЕССЕДЖИ, НЕ НАДОЕДАЕТ ЮЗЕРУ
 end;

Но так бывает с JPEG error под номером 53.
Здесь все прикрасно работает.

Теперь идя в цикле, переходим к следующему файле.
Блин. Опять Exception!!!
Ну что ж. Мы уже знаем как ее обработать и НЕ БЕСПОКОИТЬ ЮЗЕРА!!!

Ага, ничего подобного, потому что на этот раз у нас "JPEG error #42" (ПОД НОМЕРОМ 42) но прога не виснет, все что нужно освободить у нас освобождаеться, УТЕЧКИ МОЗГОВ НЕТ.
Но одна проблема все же есть: ВЫПЛЫВАЕТ МЕССЕДЖ. А если таких файлов 100 штук то бедный юзер палец сломает от кликов.

Ну а зачем Юзеру вообще выдет етот Меседж????? Он что поможет этому файлу???????? Ну да если делать правильно то можно просто в лог добавить все попорченные файлы.

Допустим я так и хочу сделать. Но у меня ПОЧЕМУ ТО НЕ ПОЛУЧАЕТЬСЯ.
А ПОЧЕМУ? Если "JPEG error #53" удалось обработать, то "JPEG error #42" ВЫДАЕТ МЕССЕДЖ постоянно что бы не делал?

И тогда я ришаю написать на форуме. Пишу что хочу сделать, что получилось что нет, логично представляю всю ситуацию, и никто НИЧЕГО НЕ МОЖЕТ ПОНЯТЬ.
тогда я беру и Разжовую все по порядку.
А теперь как говорит Сергей Шнуров "СУТЬ":
Обьясните - ПОЧЕМУ при "JPEG error #53" удаеться не ТРИВОЖИТЬ ЮЗЕРА МЕССЕДЖАМИ а при "JPEG error #42" ну КТО ТО СИДИТ ТАМ И ВЫКИДЫВАЕТ ЭТИ МЕССЕДЖИ??? и помогите их УБРАТЬ!!!!


 
sniknik ©   (2011-07-15 16:50) [17]

> Но у меня ПОЧЕМУ ТО НЕ ПОЛУЧАЕТЬСЯ.
КАК ПРОБОВАЛ?

> Если "JPEG error #53" удалось обработать, то "JPEG error #42" ВЫДАЕТ МЕССЕДЖ постоянно что бы не делал?
ЧТО ДЕЛАЛ?

и еще ГДЕ ДЕЛАЛ?
про то что ошибка может быть разная (на примере архива выше), от чтения/разбора/т.д. проигнорировал? 42 это вроде (по гуглю) ошибка чтения из стрима.
т.е. если ты ее пытаешься ловить на открытии файла, то нифига не выйдет, там еще данные из стрима в стрим не перекладываются.

а то что ее вообще отловить не получается, это ты извиняюсь врешь. вот к примеру показательный топик, из того  же гугля
http://www.commfort.com/ru/forum/viewtopic.php?f=3&t=4160
[02.11.2008 - 21:06:53] Связь с сервером установлена
[02.11.2008 - 23:19:05] Application error: "JPEG error #53"
[02.11.2008 - 23:19:09] Application error: "Access violation at address 004A6D83 in module "CommFort.exe". Read of address 00000000"
[02.11.2008 - 23:19:27] Application error: "Access violation at address 004A6D83 in module "CommFort.exe". Read of address 00000000"
[02.11.2008 - 23:19:34] Application error: "JPEG error #53"
[02.11.2008 - 23:19:38] Application error: "Access violation at address 004A6D83 in module "CommFort.exe". Read of address 00000000"
[02.11.2008 - 23:21:19] Application error: "JPEG error #42"
[02.11.2008 - 23:21:30] Application error: "JPEG error #42"
[02.11.2008 - 23:22:31] Application error: "JPEG error #42"
[02.11.2008 - 23:22:34] Application error: "JPEG error #53"
[02.11.2008 - 23:22:44] Application error: "JPEG error #53"
[02.11.2008 - 23:22:45] Application error: "Access violation at address 004A6D83 in module "CommFort.exe". Read of address 00000000"
[02.11.2008 - 23:22:49] Application error: "Access violation at address 004A6D83 in module "CommFort.exe". Read of address 00000000"
[02.11.2008 - 23:22:50] Application error: "Access violation at address 004A6D83 in module "CommFort.exe". Read of address 00000000"
[02.11.2008 - 23:29:15] Application error: "JPEG error #42"

как видно ошибки 53 и 42 соседствуют в логе, и перехвачены единообразно... правда судя по всему от от аппликейшина.
что возвращает к вопросу ГДЕ ДЕЛАЛ? КАК ДЕЛАЛ?

p.s. поменьше эмоций и собственных рассуждений (если бы помогали сам бы все решил), побольше понятных (как для "дурака") фактов, и кода.

p.p.s.
> Могу скинуть ту попорченую картинку с примером, если поможет.
а выложить на файлообменник не судьба? просто, если это не "напряжно" кто то может и посмотрит, а давая мыло для "скидывания" как бы "подписываешься" а это "ну его нафиг" (тут кстати ИШ ссылочку "как задавать вопросы" всем раздает... наизусть ее нужно обязать учить... ИМХО)


 
Dennis I. Komarov ©   (2011-07-15 16:51) [18]


> Вот такой вариант кода работает если ошибка "JPEG error
> #53"
> var
> JPG:TJpegImage;
> begin
> JPG:= TJpegImage.Create;
>  try
>   JPG.LoadFromFile("C:\Sony\000.jpg"); но возникает Exception
> здесь, при загрузке, а при ошибке #42 - в следующей строчке
>   Image1.Picture.Assign(JPG);
>   except
>    on E:Exception do begin
>     JPG.LoadFromFile("D:\Pictures\Films\ph-10167.jpg");
>     Image1.Picture.Assign(JPG);
>     end;
>    end;
>   JPG.Free;
> end;

Почему сдесь не может возникнуть исключение?


 
Dennis I. Komarov ©   (2011-07-15 16:55) [19]

сорри, здесь :(


 
sniknik ©   (2011-07-15 17:17) [20]

> Вот такой вариант кода работает если ошибка "JPEG error #53"
> var
> JPG:TJpegImage;
> begin
> JPG:= TJpegImage.Create;
>  try
>   JPG.LoadFromFile("C:\Sony\000.jpg"); но возникает Exception здесь, при загрузке, а при ошибке #42 - в следующей строчке
>   Image1.Picture.Assign(JPG);
>   except
>    on E:Exception do begin
>     JPG.LoadFromFile("D:\Pictures\Films\ph-10167.jpg");
>     Image1.Picture.Assign(JPG);
>     end;
>    end;
>   JPG.Free;
> end;

приведя в порядок, и убрав лишнее...
var
 JPG:TJpegImage;
begin
 try
   JPG:= TJpegImage.Create;
   try
     JPG.LoadFromFile("C:\Sony\000.jpg");
     Image1.Picture.Assign(JPG);
   finally
     JPG.Free;
   end;
 except
    {осознанное сокрытие...}
 end;
 ShowMessage("Если не это показывает, то все ОК, все отловили...");
end;

сообщение последнее видишь? при 53? при 42?


 
Inovet ©   (2011-07-15 18:20) [21]

> [16] SIV5000   (15.07.11 16:08)
> Ну да если делать правильно то можно просто в лог добавить все попорченные файлы.

Как вариант, можно сообщение вместо картинки в превью вывести. Только они разные могут быть от испорченного файла, заблокированного другим приложением и до физического отказа диска. Наверно правильнее их по разному обработать? - где-то в превью написать, а где-то и сообщение выдать с кнопками "Продолжить", "Прервать".


 
Sapersky   (2011-07-15 18:49) [22]

Я бы тоже рекомендовал другую библиотеку, хотя бы GDI+. "Битые" jpeg она неплохо грузит (если есть полфайла - загрузит эту половину), да и побыстрее стандартного модуля. И вроде бы там есть готовые функции для генерации тумбнэйлов.


 
~   (2011-07-15 20:25) [23]

jpeg dcu юзаем? угу нятно.
1. Версия делфей не указана.
2. Эта юнита глючная. Я сам с ней в свое время замучился. Хотел кидать через порт "толпу" превьюшек....  Пришлось остановиться на пожатых бмпешках. Так что попробуте другие средства обработки jpg

ps/ вообще чудесатая юнита )


 
SIV5000   (2011-07-15 22:13) [24]


> jpeg dcu юзаем?

Угу :)


> sniknik: а то что ее вообще отловить не получается, это ты извиняюсь
> врешь. вот к примеру показательный топик, из того  же гугля


Я к 53 ничего не имею. он ловиться а вот 42 нет.


> а выложить на файлообменник не судьба? просто, если это
> не "напряжно" кто то может и посмотрит, а давая мыло для
> "скидывания" как бы "подписываешься" а это "ну его нафиг"
> (тут кстати ИШ ссылочку "как задавать вопросы" всем раздает.
> .. наизусть ее нужно обязать учить... ИМХО)


Ich "understand" du nicht! :)

Короч. Народ гляньте там должно быть понятно.
http://depositfiles.com/files/1easx1z7w


 
sniknik ©   (2011-07-16 13:23) [25]

[20]
+
...
Image1.Picture.Assign(JPG);
Image1.Refresh;
...

уже говорил что ошибка может быть от разных действий, тока примеры другие, тут дает не загрузке/присвоении а на отрисовке, после выполнения процедуры. т.е. рисуем "в блоке", и все дела.

>  :)
зря иронизируешь, все проблема "на 5 мин", но из-за постановки вопроса проблема в том чтобы понять в чем проблема... и неважно что ты понимаешь, важно чтобы руководствовался этим.


 
SIV5000   (2011-07-16 14:51) [26]


> sniknik

Спасибо. Какая то мелочь но столько времени заняло..... :)
Просто в следующий раз, если возможно будет, то буду сразу же пример викладывать потому что обьяснение реально занимает МНОГО времени и усилий :) И самое главной что задело так то что кроме try ...finally и try ... except (на сколько я знаю) ничем больше не воспользоваться и оно не помагало. Ну вот так вот.


 
sniknik ©   (2011-07-16 15:36) [27]

> кроме try ...finally и try ... except (на сколько я знаю) ничем больше не воспользоваться
Application.OnException



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.11.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.004 c
2-1310738232
Aljonushka
2011-07-15 17:57
2011.11.06
Как вставить столбец данных из Экселя в СтрингГрид?


15-1310030170
SQLEXPRESS
2011-07-07 13:16
2011.11.06
Распечатать много листов, шаблон дать менять юзеру


2-1310474200
SIV5000
2011-07-12 16:36
2011.11.06
JPEG error + on E: Exception


15-1310017395
И. Павел
2011-07-07 09:43
2011.11.06
Запрет на повторный запуск программы под одним пользователем


6-1243782288
ikot
2009-05-31 19:04
2011.11.06
Intel Jpeg Library и сокеты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский