Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.10.04;
Скачать: CL | DM;

Вниз

TPicture.LoadFromFile - интерпритация формата по содержимому.   Найти похожие ветки 

 
Akad   (2011-02-27 16:56) [0]

Есть много картинок. У части из них попутаны расширения, то есть png имеют расширение jpeg, gif - png и так далее.
Как известно в борланде работая над TPicture.LoadFromFile пошли по самому простому пути - интерпретация формата файла по расширению, то есть картинки с не правильным расширением эта функция не загрузит.
Вопрос: как с минимумом телодвижений загрузить картинку в TPicture.Graphic? Очень не хочется самому анализировать и переименовывать файл. Должно же быть нормальное готовое решение!


 
clickmaker ©   (2011-02-27 18:06) [1]

GraphicEx


 
Amoeba_   (2011-02-27 22:19) [2]


> clickmaker ©   (27.02.11 18:06) [1]
>
> GraphicEx

Оно самое тута:
http://www.soft-gems.net/index.php?option=com_content&task=view&id=13&Itemid=33


 
Akad   (2011-03-17 22:36) [3]

А как его включить? Делаю:

uses ..., GraphicEx;
....
Image1.Picture.LoadFromFile("321.tmp"); // Получаю Unknown picture file extention (.tmp)
Image1.Picture.LoadFromFile("321.bmp"); // Получаю bitmap image is not valid.

Оба раза пытаюсь грузить jpeg.


 
brother ©   (2011-03-18 05:39) [4]

нужно создать новый объект (подозреваю TGraphicEx) и в него уже грузить картинки, а не в стандартный:

> Image1.Picture.LoadFromFile("321.tmp"); // Получаю Unknown
> picture file extention (.tmp)
> Image1.Picture.LoadFromFile("321.bmp"); // Получаю bitmap
> image is not valid.

это стандарные ошибки Image те,

> интерпретация формата файла по расширению


 
Amoeba_   (2011-03-18 11:14) [5]


> Akad   (17.03.11 22:36) [3]
>
> А как его включить? Делаю:
>
> uses ..., GraphicEx;

Здесь все делаешь правильно.


> Image1.Picture.LoadFromFile("321.tmp"); // Получаю Unknown
> picture file extention (.tmp)
> Image1.Picture.LoadFromFile("321.bmp"); // Получаю bitmap
> image is not valid.
>
> Оба раза пытаюсь грузить jpeg.
>


Не то что странного, а просто невозможного хочешь. Формат сперва идентифицируется по расширению. Затем уже проверяется сигнатура, и если она не та, то получаешь по лбу.


 
Akad   (2011-03-18 11:20) [6]


> Не то что странного, а просто невозможного хочешь.

Почему не возможного? См. первый пост. 2 человека ответило, что это без проблем делается через GraphicEx.
А вообще говоря мне надо всё это дело из потока грузить, из БД. Ну это уже мелочи, главное научиться нормально загружать картинки. Например из .tmp файла.


 
Dimka Maslov ©   (2011-03-18 11:47) [7]

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


 
Amoeba_   (2011-03-18 11:54) [8]


> Очень не хочется самому анализировать
> и переименовывать файл. Должно же быть нормальное готовое
> решение!

Хоть и не хочется анализировать и переименовывать, а придется. Готового решения нет.


 
clickmaker ©   (2011-03-18 12:01) [9]

use TGraphicExGraphic


 
clickmaker ©   (2011-03-18 12:04) [10]

+ CanLoad()


 
Akad   (2011-03-18 12:08) [11]


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

Мне нужно не отличить, а загрузить. Понятно, что можно убить неделю и самому написать нормальные загрузчики, вместо кривых дельфёвых, но подозреваю, что это будет изобретением велосипеда.
Хотя с другой стороны поиск в гугле выводит только на GraphicEx, которая работать у меня отказывается, а во всех их примерах они вместо нормальной загрузки просто определяют что за тип изображения в файле и грузят соответствующим классом. Всё бы ничего, но FileFormatList например не умеет потоки.
Так что похоже всё-же придётся велосипед изобрести. :(


 
Akad   (2011-03-18 12:12) [12]


> use TGraphicExGraphic

Ну тоже с ходу не умеет.
  Graphic := TGraphicExGraphic.Create;
  Graphic.LoadFromStream(stream); //Получаю bitmap image is not valid.

> + CanLoad()

А что это даст? Мне надо загрузить, а не спрашивать может ли он загрузить jpeg.


 
clickmaker ©   (2011-03-18 12:24) [13]

> Мне надо загрузить, а не спрашивать может ли он загрузить
> jpeg.

CanLoad не зря сделана class function для удобства.
Т.е. запросто можно реализовать перебор вызовов TXXXGraphic.CanLoad с последующим созданием подошедшего объекта


 
Akad   (2011-03-18 12:41) [14]


> CanLoad не зря сделана class function для удобства.Т.е.
> запросто можно реализовать перебор вызовов TXXXGraphic.CanLoad
> с последующим созданием подошедшего объекта

Т.е резюме: ни какого преимущества/удобства и пр. GraphicEx не даёт. Всё та же убогость, что и в стандартной поставке дельфи. Просто добавляет немного экзотических форматов картинок и всё.
Неужели не существует нормальных библиотек для работы с графикой в дельфи??? Не верю!


 
Dimka Maslov ©   (2011-03-18 12:45) [15]

Akad   (18.03.11 12:08) [11]

Что мешает перед загрузкой файла проверить по сигнатуре тип файла, дать ему (или копии) правильное расширение, а потом загрузить файл обычным порядком?

Дополнительно сообщу, что
а) в начале bmp находятся два байта BM
б) начиная с 7-го байта в файлах jpg находятся знаки JFIF
в) в начале png со 2-го байта есть символы PNG


 
Amoeba_   (2011-03-18 12:46) [16]


> Неужели не существует нормальных библиотек для работы с
> графикой в дельфи???

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


 
Akad   (2011-03-18 12:55) [17]


> Что мешает перед загрузкой файла проверить по сигнатуре
> тип файла, дать ему (или копии) правильное расширение, а
> потом загрузить файл обычным порядком?

В том-то и дело, я надеялся на то, что
Во-первых не придётся изобретать велосипед.
Во-вторых например с тем-же jpeg не всё так просто. Надо первые 2 байта смотреть, а потом идти по SOI/EOI что бы убедиться, что это jpeg, а не например mpeg или mjpeg или что-нибудь подобное. В общем это далеко не минута по времени написания кода.

> Нормальные библиотеки совершенно не обязаны разбираться
> с бардаком в виде перепутанных расширений. Это никак не
> входит в круг их задач.

Обязаны. Нормальные библиотеки обязаны грузиться из потока. А там расширений нет. В прочем как и нет нормальных библиотек для открытия картинок под дельфи, на сколько я понял...


 
clickmaker ©   (2011-03-18 13:09) [18]

> Неужели не существует нормальных библиотек для работы с
> графикой в дельфи??? Не верю!

у тебя есть шанс стать первым и войти в историю. Тем более, что не с нуля придется начинать


 
sniknik ©   (2011-03-18 13:55) [19]

> обязаны грузиться из потока.
но ты грузишь почему то с файла... библиотека виновата?


 
Dimka Maslov ©   (2011-03-18 14:09) [20]


> общем это далеко не минута по времени написания кода.


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


 
Akad   (2011-03-18 15:11) [21]


> но ты грузишь почему то с файла... библиотека виновата?

Где я такое написал? У меня все файлы из web перекачёвывают в БД.

P.S. Ладно. Обошёл я эту кривость дельфи и всех сторонних приблуд к ней с помощью анализа трафика. Вопрос закрывается, так как нормального решения не имеет.


 
Amoeba_   (2011-03-18 17:01) [22]


> кривость дельфи и всех сторонних приблуд к ней

LMD!
Не надо с больной головы валить за здоровую. Никакой кривости нет. То, что сперва проверяется расширение файла, а только потом он открывается и считывается (а если его формат не соответствует ожидаемому только тогда следует ругань) - это как раз стандарт.


 
clickmaker ©   (2011-03-18 17:08) [23]

а я вообще не понял, как "как с минимумом телодвижений загрузить картинку в TPicture.Graphic?" связано с "Обошёл я эту кривость дельфи и всех сторонних приблуд к ней с помощью анализа трафика" и "У меня все файлы из web перекачёвывают в БД"?


 
Соискатель   (2012-03-30 13:41) [24]


> То, что сперва проверяется расширение файла, а только потом
> он открывается и считывается (а если его формат не соответствует
> ожидаемому только тогда следует ругань) - это как раз стандарт.
>

Все просмоторщики изображений включая проводник написаны не по этому стандарту. И это хорошо.


 
Соискатель   (2012-03-30 13:42) [25]

Библиотек мало, потому что язык не тот и не в топе


 
Кщд   (2012-03-30 15:26) [26]

>Соискатель   (30.03.12 13:42) [25]
толсто


 
DVM ©   (2012-03-30 16:29) [27]


> Akad   (27.02.11 16:56) 

Ищешь сигнатуры известных форматов и по аналогии с:

class function TMimeType.GuessContentTypeFromContent(AContent: PAnsiChar): string;
var
 c1, c2, c3, c4, c5, c6, c7, c8: AnsiChar;
begin
 c1 := AContent[0];
 c2 := AContent[1];
 c3 := AContent[2];
 c4 := AContent[3];
 c5 := AContent[4];
 c6 := AContent[5];
 c7 := AContent[6];
 c8 := AContent[7];
 result := "";
 if (c1 = "G") and (c2 = "I") and (c3 = "F") and (c4 = "8") then
   result := "image/gif"
 else if (c1 = "#") and (c2 = "d") and (c3 = "e") and (c4 = "f") then
   result := "image/x-bitmap"
 else if (c1 = "!") and (c2 = " ") and (c3 = "X") and (c4 = "P")
   and (c5 = "M") and (c6 = "2") then
   result := "image/x-pixmap"
 else if (c1 = #137) and (c2 = #80) and (c3 = #78) and (c4 = #71) and (c5 = #13)
   and
   (c6 = #10) and (c7 = #26) and (c8 = #10) then
   result := "image/png"
 else if (c1 = #$2E) and (c2 = #$73) and (c3 = #$6E) and (c4 = #$64) then
   result := "audio/basic" // .au format, big endian
 else if (c1 = #$64) and (c2 = #$6E) and (c3 = #$73) and (c4 = #$2E) then
   result := "audio/basic" // .au format, little endian
 else if (c1 = "<") then
 begin
   if ((c2 = "!")) or
     ((c2 = "h") and (c3 = "t") and (c4 = "m") and (c5 = "l")) or
     ((c2 = "h") and (c3 = "e") and (c4 = "a") and (c5 = "d")) or
     ((c2 = "b") and (c3 = "o") and (c4 = "d") and (c5 = "y")) or
     ((c2 = "H") and (c3 = "T") and (c4 = "M") and (c5 = "L")) or
     ((c2 = "H") and (c3 = "E") and (c4 = "A") and (c5 = "D")) or
     ((c2 = "B") and (c3 = "O") and (c4 = "D") and (c5 = "Y")) then
     result := "text/html"
   else if (c2 = "?") and (c3 = "x") and (c4 = "m") and (c5 = "l") and (c6 =
     " ") then
     result := "application/xml";
 end
 else if (c1 = #$FF) and (c2 = #$D8) and (c3 = #$FF) and (c4 = #$E0) then
   result := "image/jpeg"
 else if (c1 = #$FF) and (c2 = #$D8) and (c3 = #$FF) and (c4 = #$EE) then
   result := "image/jpg"
 else if (c1 = "R") and (c2 = "a") and (c3 = "r") and (c4 = "!") then
   result := "application/x-rar"
 else if (c1 = "F") and (c2 = "W") and (c3 = "S") then
   result := "application/x-shockwave-flash"
 else if (c1 = "M") and (c2 = "S") and (c3 = "C") and (c4 = "F") then
   result := "application/cab"
 else if (c1 = "M") and (c2 = "Z") then
   result := "application/x-msdos-program"
 else if (c1 = "P") and (c2 = "K") and (c3 = #$03) and (c4 = #$04) then
   result := "application/zip"
 else if (c1 = "B") and (c2 = "M") then
   result := "image/bmp";
end;


 
DVM ©   (2012-03-30 16:30) [28]

У этого подхода даже название есть какое то, но я забыл его.


 
Anatoly Podgoretsky ©   (2012-03-30 16:55) [29]

С HTML так не пойдет, совсем не обязательно что это первые символы текста.


 
DVM ©   (2012-03-30 17:00) [30]


> Anatoly Podgoretsky ©   (30.03.12 16:55) [29]

Да я ясное дело, но лучше хоть что-то, чем вообще ничего.

Вот кстати куча сигнатур http://mark0.net/download/triddefs_xml.rar


 
brother ©   (2012-03-30 18:58) [31]

> С HTML так не пойдет,

не понял, о чем речь? сигнатуры отменили?


 
Anatoly Podgoretsky ©   (2012-03-30 19:26) [32]


> не понял, о чем речь? сигнатуры отменили?

Сигнатура когда опрделеный текст в определеном месте, для HTML ни одно из условий не выполняетсяю


 
Dimka Maslov ©   (2012-03-30 19:51) [33]

РОБЯТО! Посмотрите на дату первого поста этой темы! Вопрос закрыт год назад!


 
Anatoly Podgoretsky ©   (2012-03-30 20:05) [34]

Ты зря думаешь что закрыт, как видели это вопрос на протяжение десятка лет, так и будем видеть еще.


 
brother ©   (2012-03-30 21:01) [35]

> для HTML ни одно из условий не выполняетсяю

я не понял о чем речь?


 
Anatoly Podgoretsky ©   (2012-03-30 21:09) [36]

> brother  (30.03.2012 21:01:35)  [35]

Не совпадает в части местоположения сигнатуры


 
brother ©   (2012-03-30 21:27) [37]

> местоположения сигнатуры

а понял! почемуже нет?:
<!DOCTYPE
местоположение вполне точно определено


 
brother ©   (2012-03-30 21:29) [38]

> С HTML так не пойдет,

впрочем, разговор шел про графические файлы и их сигнатуры. Я потому и не въехал сразу о чем речь ;)


 
Anatoly Podgoretsky ©   (2012-03-30 21:45) [39]

> brother  (30.03.2012 21:27:37)  [37]

<!DOCTYPE

Вставляют генераторы, люди редко, учитывая поголовное “воровство” и это не
срабатывает, сайты тупо вставляют свой текст в начале текста, и это часто не
html или <!DOCTYPE


 
brother ©   (2012-03-31 05:56) [40]

мы говорим - сайт должен отвечать спецификации html!
они говорят - зачем? браузер же "кушает" наш код?!

зы. но всеж спецификация есть и ее надо придерживаться...



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

Текущий архив: 2015.10.04;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.006 c
1-1298814998
Akad
2011-02-27 16:56
2015.10.04
TPicture.LoadFromFile - интерпритация формата по содержимому.


15-1422180830
AndrewAndrey
2015-01-25 13:13
2015.10.04
Ошибка при запуске приложения 0xc0000005


15-1423949475
Юрий
2015-02-15 00:31
2015.10.04
С днем рождения ! 15 февраля 2015 воскресенье


15-1423863064
Юрий
2015-02-14 00:31
2015.10.04
С днем рождения ! 14 февраля 2015 суббота


15-1423203208
KSergey
2015-02-06 09:13
2015.10.04
Что есть "виртуальная машина"