Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Звук, графика и видео > Разрешение изображения |
Автор: Pavelbej 25.7.2006, 23:01 | ||
В листбокс-е находятся изображения (путь и имя файла). Этот код (создание Bitmap-a) делается только для того чтобы узнать разрешение изображения (GetBitmapDimensionsString(MyBitmap)) но что-то мне подсказывает что нужно что-то другое. Помогите, если можете, файлов много и тормозит жутко. Заранее всем благодарен в решении этой проблемы.
|
Автор: Romikgy 26.7.2006, 08:48 |
А нельзя ли просто Image1.Picture.LoadFromFile(ListBox1.Items[ListBox1.itemindex]); GetBitmapDimensionsString(Image1.Picture.Bitmap); |
Автор: Alexeis 26.7.2006, 10:01 | ||
Вот самый быстрый способ
|
Автор: Pavelbej 26.7.2006, 13:21 |
alexeis1, большое спасибо, вот только резолюцию этот код показывает не как например "1024 х 768", а какието цифры при том что файлы имеют одинаковую резолюцию. Вот примерно что у меня "-318832640 х 1967395072", "-168427523 х 1380137728" и оба файла тот же размер имеют по горизонтали и вертикали, оба файла - .jpg, первый весит 47 Кб - второй 88 Кб (на всякий случай). В чем причина может быть? |
Автор: Alexeis 26.7.2006, 13:25 |
Pavelbej, Этот код работает только для BMP. Для JPG надо устанавливать другое смещение |
Автор: Pavelbej 26.7.2006, 14:26 |
Покажи пример пожалуйста. И прокоментируй код если тебе не трудно а то для меня это вче ново. |
Автор: Romikgy 26.7.2006, 14:58 |
TJPEGImage не? в нем есть и высота и ширина ![]() |
Автор: dumb 26.7.2006, 15:05 | ||
sorry, no comments... ![]()
|
Автор: Pavelbej 26.7.2006, 16:37 | ||
dumb, я попробовал, вроде все нормально но у некоторых файлов разрешение отображается неправильно, почему не знаю. Вот я что нашел но это для (( Dots Per Inch )) и (( Dots Per Cm)). Посмотрите может измените код чтобы узнать горизонтальный и вертикальный размер изображения в пикселях:
|
Автор: dumb 26.7.2006, 16:50 |
покажи(прикрепи, выложи куда-нибудь) пару файлов, у которых неправильно отображается разрешение. |
Автор: Pavelbej 26.7.2006, 17:02 |
Вот эти например не отображались правильно: http://www.vscsoftware.com/download/1.rar |
Автор: Alexeis 26.7.2006, 17:11 | ||
В любом случае все перечисленные способы мягко говоря некорректны! Добавлено @ 17:16 Нельзя запускать простой поиск, поскольку среди значений даннных могут встречатся указанные комбинации. Вот ссылка на подробное описание формата на русском языке http://www.matrix-wb.h1.ru/article/formats/jpeg-rus.html Смотрите вконце описание "SOF0: Начало Кадра 0:" Разбор надо вести сегменрами а не байтами, тогда точно попадете на нужные места и не будет случайных совпадений вызывающих ложную остановку поиска! |
Автор: dumb 26.7.2006, 17:48 | ||||
разбор идет побайтно, однако... просто та функция, которую я нашел, не учитывает некоторые моменты: такие как exif, thumb'ы итд... |
Автор: dumb 26.7.2006, 19:31 |
эм. что такое "искомый сегмент" и чем он определяется? и откуда ты взял "размер сегмента" для сдвига? вот в тех "неправильных" картинках по три блока SOF0 - какой из них нужный? |
Автор: Pavelbej 26.7.2006, 20:17 | ||
Наткнулся в сети вот на это. Проверил - вообще не работает.
|
Автор: Alexeis 26.7.2006, 21:15 | ||
В первой попвшейся картинке JPEG я нашел целых 3 таких сегмена (блока) и только во втором блоке начиная с 3 го байта содержатся высота и ширина |
Автор: Pavelbej 27.7.2006, 09:27 |
alexeis1, земляк, может поможешь кодом а? ![]() ![]() |
Автор: Romikgy 27.7.2006, 10:15 | ||
народ а че вы лисапеды изобретаете, есть же уже написаное в дельфи
|
Автор: Alexeis 27.7.2006, 10:22 | ||||
Все очень просто делается, читается первый сегмент, проверяется на совпадение с искомым, если не совпадает, то сдвигаемся на размер сегмента до следующего и так далее, пока не найдем нужный, затем в нужном сегменте находится нужная позиция. Сегментная модель не требут знания всех блоков, неидентифицированные блоки просто пропускаются. Ну и задолбался я ![]() Т.о. получаем следующий код
Данный код правельно определяет парметры у всех jpeg (и у указанных в 1.rar тоже) Как показал просмотр данные изображения имели дополнительные сегменты(содержащие данные о производителе фотографии). В них содержалась произвольная информация (нерегламентированая ) которая совпадала с комбинацией $FFC0, что и приводило к ложному опознованию такой информации как сегменом SOF0. Кроме того данный код имеет колосальное приемущество в скорости, поскольку не сканирует все байты подряд, а читает только выборочные (идентификаторы и размеры сегментов). И конечно же не грузит и не декодирует файл целиком. ![]() Добавлено @ 10:31
Вопервых делфийский компанент не загружает все типы изображений, во вторых, если он это и сделает то с какой скоростью! Если картинка будет 3000х2000, он же несколько секунд грузить ее будет, и все ради чего чтобы узнать лишь ее разрешение! |
Автор: Romikgy 27.7.2006, 10:47 | ||
Как знаете |
Автор: Alexeis 27.7.2006, 10:56 |
Дело в том, что уже были проблемы с ним и не раз. А свой код я писал, разобравшись в оригинальной документации по jpeg ITU - 1150 (INFORMATION TECHNOLOGY – DIGITAL COMPRESSION AND CODING OF CONTINUOUS-TONE STILL IMAGES – REQUIREMENTS AND GUIDELINES) |
Автор: Pavelbej 3.8.2006, 18:22 |
alexeis1, вот еще одна "неправильная" картинка. http://www.vscsoftware.com/166.jpg |
Автор: Alexeis 3.8.2006, 20:18 | ||||||
Что сказать, картинка и вправду неподарок, однако, она таки соответствует стандатру. Имеется ондна маленькая слабинка, которая прилично усложняет просмотр!
Причем первая часть противеречит второй, так как допускает перед началом сегмента баласт ("number of fill bytes"), длинна которого неопределенна. Это как раз и произошло в данном случае. Посмотрим на картинку ВинХекса: ![]() на картинке виден пустой блок, который необходимо обойти. --------------------------------------------------------------------------------------------------------------- Вот код добавил код обхода теперь распознает и эту картинку
|
Автор: Pavelbej 4.8.2006, 00:14 |
alexeis1, огромное спасибо но вот что я еще нашел: http://www.vscsoftware.com/Background.jpg И что интересно так это то, что моя прога даже не отображает эту картинку, а уж про разрешение и не говорю. |
Автор: Alexeis 4.8.2006, 00:32 | ||
Конечно это же переименованная PNG - шка ![]() ![]() ![]() Добавлено @ 00:34 Код jpg - FF D8 А тут 89 50 4E 47 50 4E 47 - в аски формате - "PNG" |
Автор: Pavelbej 4.8.2006, 00:58 |
Вот тормоз! Мне ее тут на форуме подкинули, извини. ![]() |
Автор: Alexeis 4.8.2006, 01:14 |
На самом деле не так просто определить что это такое, ACDSEE, который любит ругатся на любое несоответствие формата, молча отобразил как будто так и надо. WINHEX - в таких вещах здорово помогает. Открыл и сразу видно, заголовку. Вообще програмы графического просмотра явно расширение игнорируют и по заголовку судят. |