PDA

Показать полную графическую версию : Поиск "битых" изображений


pzh2393
09-12-2013, 15:27
После восстановления изображений с винчестера часть из них оказались нерабочими.
Можно ли как-то автоматически отсортировать такие файлы? основная ошибка - часть файла "обнулена" (содержит строки FF FF FF FF...).
Или может быть кто-то знает утилиту проверяющую соответствие структуры JPEG?

Опиум
09-12-2013, 18:25
На ловца и зверь бежит. Несколько лет назад случилось аналогичное ЧП на сервере файл-помойке фоток. Написал консольную утилиту.

testjpeg.exe filename

возвращает errorlevel:
0 - если filename - корректное jpg изображение
1 - если filename - некорректное jpg изображение))
255 - если filename несуществует.

pzh2393
09-12-2013, 18:59
Спасибо!
А можно чуть подробнее как именно происходит проверка изображения? по каким критериям?

Iska
09-12-2013, 19:01
Могу предложить такой вариант:
Option Explicit

Dim strSourceFolder
Dim strDestFolder

Dim objFile
Dim objMagickImage


If WScript.Arguments.Count = 2 Then
strSourceFolder = WScript.Arguments.Item(0)
strDestFolder = WScript.Arguments.Item(1)

With WScript.CreateObject("Scripting.FileSystemObject")
If .FolderExists(strSourceFolder) Then
If .FolderExists(strDestFolder) Then
Set objMagickImage = WScript.CreateObject("ImageMagickObject.MagickImage.1")

For Each objFile In .GetFolder(strSourceFolder).Files
Select Case LCase(.GetExtensionName(objFile.Name))
Case "jpg", "jpeg", "jpe"
On Error Resume Next
objMagickImage.Identify "-format", "Name:[%f] Type:[%m] Dim:[%wx%hx%z]\r\n", objFile.Path

If Err.Number = 0 Then
On Error Goto 0
objFile.Move strDestFolder & "\"
Else
Err.Clear
On Error Goto 0
End If
Case Else
' Nothing to do
End Select
Next

Set objMagickImage = Nothing
Else
WScript.Echo "Destination folder [" & strDestFolder & "] not found."
WScript.Quit 2
End If
Else
WScript.Echo "Source folder [" & strSourceFolder & "] not found."
WScript.Quit 2
End If
End With
Else
WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " <Source folder> <Destination folder>"
WScript.Echo "Example: cscript.exe //nologo " & WScript.ScriptName & " ""E:\Песочница\0335\Source"" ""E:\Песочница\0335\Destination"""
WScript.Quit 1
End If

WScript.Quit 0
с использованием ImageMagick (http://www.imagemagick.org/script/index.php).

Опиум
09-12-2013, 19:11
pzh2393, не волнуйся, по "хорошим критериям". проверь сам её работу и убедись.


rem e:\хххporno - например коллекция фоток, где есть битые.
md %temp%\bad_jpg
cd /d e:\хххporno
dir /s /b *.jpg >%temp%\jpglist.txt
for /f "delims=*" %%i in (%temp%\jpglist.txt) do (testjpeg "%%i" || (move "%%i" %temp%\bad_jpg\)

и смотрим потом папку %temp%\bad_jpg

pzh2393
09-12-2013, 19:27
по "хорошим критериям" »
Я как бы и не сомневался... просто хотел убедиться, что это будет универсальный вариант под все мои частные случаи. Предпочитаю знать наверняка.
Пы.Сы. Обязательно проверю и напишу результаты с впечатлениями! Ещё раз спасибо!

Могу предложить такой вариант: »
Спасибо! Тоже попробую.

pzh2393
09-12-2013, 19:50
Цитата Опиум:
и смотрим потом папку %temp%\bad_jpg »
Что-то предложенный Вами командный файл у меня не выполняется... может выплнить то же самое на vbs?

Решил скормить утилите пару файлов напрямую
c:\testJPEG\testjpeg.exe c:\testJPEG\000-011.JPG
pauseМне постоянно возвращает "0", хотя некоторые файлы явно нечитаемы, а часть опробованных имеет "обнуленные" области.

Iska
09-12-2013, 21:36
Опиум, не возвращает положительный код ошибки на специально подготовленных «битых» файлах *.jpg. Windows XP SP3.

Опиум
10-12-2013, 15:38
pzh2393 хм. можешь выложить пример битого jpg? который вьювером не открывается, а моя прога даёт errorlevel=0.
з.ы. прога писана на дельфях с подгрузкой файла, как jpegimage

pzh2393
10-12-2013, 16:04
Опиум, мои файлы слишком тяжелые (от 3Mb), форум не даст вложить такой размер, проще на более мелком файле сгенерировать похожую ошибку.
107813 это пример для последовательного (Baseline) режима кодирования где четко видна граница запорченной области, а идентичная ошибка для прогрессивного режима не имеет такого явного визуального дефекта, поскольку ошибка может прийтись на один из последних "сканов" и найти её можно только анализом структуры или при попытке редактирования.

Опиум
10-12-2013, 16:11
pzh2393, стоп. указанный тобой файл открывается вьювером. да - изображение там подпорчено, но с т.з. человека.
В моём случае надо было хотябы разделить миллион файлов на те, что просматриваются вьювером и те на которых он даёт ошибку.

pzh2393
10-12-2013, 16:14
Опиум, вьювер вьюверу тоже рознь! некоторые могут исправлять незначительные ошибки декодирования, а некоторые нет.

Опиум
10-12-2013, 16:20
pzh2393, тогда сложно ИМХО корректно удовлетворить твою портребность. Вьювер - тоже прога использующая какую либо графич библиотеку. У тебя есть вьювер, который ругается на опубликованный тобой файл?

Моя прога использует объект из дельфи для определения корректности jpeg.

[offtop]
мой знакомый получил задание написать прогу, которая определяет, отредактирована ли фотография в каком-либо граф редакторе или нет. Причем не на основе тегов, которые оставляет фотодевайс или редактор, а на основе анализа содержимого изображения. Сложно.. но у него есть успехи. Показывал, но саму прогу не даёт)

Iska
10-12-2013, 16:52
pzh2393, c «ImageMagick» — всё нормально:
E:\Песочница\0335>"C:\Program Files\ImageMagick-6.3.4-Q8\identify.exe" IK-RA.jpg
IK-RA.jpg JPEG 798x652 798x652+0+0 DirectClass 8-bit 189.443kb 0.047u 0:01
identify.exe: Corrupt JPEG data: premature end of data segment `IK-RA.jpg'.
identify.exe: Unsupported marker type 0x37 `IK-RA.jpg'.

да - изображение там подпорчено, но с т.з. человека. »
Это шутка такая?

Опиум
10-12-2013, 17:39
Iska, отлично что есть крутая утилита решающая вопрос. Она может быть использована как отдельный экзешник или нужно её инсталлировать пакетом?

Iska
10-12-2013, 18:03
Раз в вариантах поставки есть и zip-вариант, то можно и отдельно. Вот что говорит «Dependency Walker»:
http://img577.imageshack.us/img577/4513/2i56.png

pzh2393
10-12-2013, 19:30
У тебя есть вьювер, который ругается на опубликованный тобой файл? »
Пример вьювера сейчас не приведу... мне необходимо чтобы изображение не вызывало ошибки при открытии в Фотошоп, который хоть и не является вьювером, но ругается на несоответствии структуры файла и не открывает его.
Моя прога использует объект из дельфи для определения корректности jpeg. »
Ранее я спрашивал на основе каких параметров происходит определение именно для определения подходит ли мне такое решение.
Под описанную в шапке задачу программа подходит лишь частично, а хотелось бы универсальное решение.
c «ImageMagick» — всё нормально: »
Спасибо, буду пробовать, хотя вариант с маленькой консольной утилитой мне нравился больше чем многомегабайтная "лишняя" программа в системе.

kiripanda
10-12-2013, 23:10
CMD с jpegtran.exe http://forum.wincmd.ru/viewpost.php?p=56916

Опиум
11-12-2013, 10:03
pzh2393, ок. есть у меня утилитка "посложнее". На твое фото ругнулась. Утилитка делает из файла иконку.


d:\>jpegscale8
JPEGscale8.EXE file_picture.jpg max_dimension_in_Pixels
error: 255

rem это твой файл
d:\>jpegscale8 G:\system\_temp\testjpeg.jpg 128
G:\system\_temp\testjpeg.jpg error: 1

rem это хорошая фотка
d:\>jpegscale8 G:\system\_temp\20130921_082640.jpg 128
G:\system\_temp\20130921_082640.jpg error: 0
возвращает errorlevel и при успехе создаёт файл иконку именем *_thumb.JPG

http://makware.ru/download/jpegutils.rar




© OSzone.net 2001-2012