![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TPicture.LoadFromFile - интерпритация формата по содержимому.
Akad © (2011-02-27 16:56:00)Есть много картинок. У части из них попутаны расширения, то есть png имеют расширение jpeg, gif - png и так далее.
Как известно в борланде работая над TPicture.LoadFromFile пошли по самому простому пути - интерпретация формата файла по расширению, то есть картинки с не правильным расширением эта функция не загрузит.
Вопрос: как с минимумом телодвижений загрузить картинку в TPicture.Graphic? Очень не хочется самому анализировать и переименовывать файл. Должно же быть нормальное готовое решение!
Соискатель (2012-03-30 13:42:00) [21]Библиотек мало, потому что язык не тот и не в топе
Соискатель (2012-03-30 13:41:00) [22]
> То, что сперва проверяется расширение файла, а только потом
> он открывается и считывается (а если его формат не соответствует
> ожидаемому только тогда следует ругань) - это как раз стандарт.
>
Все просмоторщики изображений включая проводник написаны не по этому стандарту. И это хорошо.
clickmaker (2011-03-18 17:08:00) [23]а я вообще не понял, как "как с минимумом телодвижений загрузить картинку в TPicture.Graphic?" связано с "Обошёл я эту кривость дельфи и всех сторонних приблуд к ней с помощью анализа трафика" и "У меня все файлы из web перекачёвывают в БД"?
Amoeba_ (2011-03-18 17:01:00) [24]
> кривость дельфи и всех сторонних приблуд к ней
LMD!
Не надо с больной головы валить за здоровую. Никакой кривости нет. То, что сперва проверяется расширение файла, а только потом он открывается и считывается (а если его формат не соответствует ожидаемому только тогда следует ругань) - это как раз стандарт.
Akad (2011-03-18 15:11:00) [25]
> но ты грузишь почему то с файла... библиотека виновата?
Где я такое написал? У меня все файлы из web перекачёвывают в БД.
P.S. Ладно. Обошёл я эту кривость дельфи и всех сторонних приблуд к ней с помощью анализа трафика. Вопрос закрывается, так как нормального решения не имеет.
Dimka Maslov (2011-03-18 14:09:00) [26]
> общем это далеко не минута по времени написания кода.
А я вот всегда замечал, что к коде, написанном за минуту, больше удельное число ошибок на один байт, нежели в коде, написанном за час.
sniknik (2011-03-18 13:55:00) [27]> обязаныгрузиться из потока.
но ты грузишь почему то с файла... библиотека виновата?
clickmaker (2011-03-18 13:09:00) [28]> Неужели не существует нормальных библиотек для работы с
> графикой в дельфи??? Не верю!
у тебя есть шанс стать первым и войти в историю. Тем более, что не с нуля придется начинать
Akad (2011-03-18 12:55:00) [29]
> Что мешает перед загрузкой файла проверить по сигнатуре
> тип файла, дать ему (или копии) правильное расширение, а
> потом загрузить файл обычным порядком?
В том-то и дело, я надеялся на то, что
Во-первых не придётся изобретать велосипед.
Во-вторых например с тем-же jpeg не всё так просто. Надо первые 2 байта смотреть, а потом идти по SOI/EOI что бы убедиться, что это jpeg, а не например mpeg или mjpeg или что-нибудь подобное. В общем это далеко не минута по времени написания кода.
> Нормальные библиотеки совершенно не обязаны разбираться
> с бардаком в виде перепутанных расширений. Это никак не
> входит в круг их задач.
Обязаны. Нормальные библиотеки обязаны грузиться из потока. А там расширений нет. В прочем как и нет нормальных библиотек для открытия картинок под дельфи, на сколько я понял...
Amoeba_ (2011-03-18 12:46:00) [30]
> Неужели не существует нормальных библиотек для работы с
> графикой в дельфи???
Нормальныебиблиотеки совершенно не обязаны разбираться с бардакомв виде перепутанных расширений. Это никак не входит в круг их задач.
Dimka Maslov (2011-03-18 12:45:00) [31]Akad (18.03.11 12:08) [11]
Что мешает перед загрузкой файла проверить по сигнатуре тип файла, дать ему (или копии) правильное расширение, а потом загрузить файл обычным порядком?
Дополнительно сообщу, что
а) в начале bmp находятся два байта BM
б) начиная с 7-го байта в файлах jpg находятся знаки JFIF
в) в начале png со 2-го байта есть символы PNG
Akad (2011-03-18 12:41:00) [32]
> CanLoad не зря сделана class function для удобства.Т.е.
> запросто можно реализовать перебор вызовов TXXXGraphic.CanLoad
> с последующим созданием подошедшего объекта
Т.е резюме: ни какого преимущества/удобства и пр. GraphicEx не даёт. Всё та же убогость, что и в стандартной поставке дельфи. Просто добавляет немного экзотических форматов картинок и всё.
Неужели не существует нормальных библиотек для работы с графикой в дельфи??? Не верю!
clickmaker (2011-03-18 12:24:00) [33]> Мне надо загрузить, а не спрашивать может ли он загрузить
> jpeg.
CanLoad не зря сделана class function для удобства.
Т.е. запросто можно реализовать перебор вызовов TXXXGraphic.CanLoad с последующим созданием подошедшего объекта
Akad (2011-03-18 12:12:00) [34]
> use TGraphicExGraphic
Ну тоже с ходу не умеет.
Graphic := TGraphicExGraphic.Create;
Graphic.LoadFromStream(stream); //Получаю bitmap image is not valid.
> + CanLoad()
А что это даст? Мне надо загрузить, а не спрашивать может ли он загрузить jpeg.
Akad (2011-03-18 12:08:00) [35]
> По сигнатурам файлов вполне возможно отличить джипег от
> битмапа и пнга.
Мне нужно не отличить, а загрузить. Понятно, что можно убить неделю и самому написать нормальные загрузчики, вместо кривых дельфёвых, но подозреваю, что это будет изобретением велосипеда.
Хотя с другой стороны поиск в гугле выводит только на GraphicEx, которая работать у меня отказывается, а во всех их примерах они вместо нормальной загрузки просто определяют что за тип изображения в файле и грузят соответствующим классом. Всё бы ничего, но FileFormatList например не умеет потоки.
Так что похоже всё-же придётся велосипед изобрести. :(
clickmaker (2011-03-18 12:04:00) [36]+ CanLoad()
clickmaker (2011-03-18 12:01:00) [37]use TGraphicExGraphic
Amoeba_ (2011-03-18 11:54:00) [38]
> Очень не хочется самому анализировать
> и переименовывать файл. Должно же быть нормальное готовое
> решение!
Хоть и не хочется анализировать и переименовывать, а придется. Готового решения нет.
Dimka Maslov (2011-03-18 11:47:00) [39]По сигнатурам файлов вполне возможно отличить джипег от битмапа и пнга.
Akad (2011-03-18 11:20:00) [40]
> Не то что странного, а просто невозможного хочешь.
Почему не возможного? См. первый пост. 2 человека ответило, что это без проблем делается через GraphicEx.
А вообще говоря мне надо всё это дело из потока грузить, из БД. Ну это уже мелочи, главное научиться нормально загружать картинки. Например из .tmp файла.