Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Поиск "битых" изображений (http://forum.oszone.net/showthread.php?t=273648)

pzh2393 09-12-2013 15:27 2269360

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

Опиум 09-12-2013 18:25 2269478

Вложений: 1
На ловца и зверь бежит. Несколько лет назад случилось аналогичное ЧП на сервере файл-помойке фоток. Написал консольную утилиту.

testjpeg.exe filename

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

pzh2393 09-12-2013 18:59 2269497

Спасибо!
А можно чуть подробнее как именно происходит проверка изображения? по каким критериям?

Iska 09-12-2013 19:01 2269498

Могу предложить такой вариант:
читать дальше »
Код:

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.

Опиум 09-12-2013 19:11 2269503

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 2269508

Цитата:

Цитата Опиум
по "хорошим критериям" »

Я как бы и не сомневался... просто хотел убедиться, что это будет универсальный вариант под все мои частные случаи. Предпочитаю знать наверняка.
Пы.Сы. Обязательно проверю и напишу результаты с впечатлениями! Ещё раз спасибо!

Цитата:

Цитата Iska
Могу предложить такой вариант: »

Спасибо! Тоже попробую.

pzh2393 09-12-2013 19:50 2269524

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

Решил скормить утилите пару файлов напрямую
Код:

c:\testJPEG\testjpeg.exe c:\testJPEG\000-011.JPG
pause

Мне постоянно возвращает "0", хотя некоторые файлы явно нечитаемы, а часть опробованных имеет "обнуленные" области.

Iska 09-12-2013 21:36 2269600

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

Опиум 10-12-2013 15:38 2270037

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

pzh2393 10-12-2013 16:04 2270059

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

Опиум 10-12-2013 16:11 2270067

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

pzh2393 10-12-2013 16:14 2270071

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

Опиум 10-12-2013 16:20 2270079

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

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

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

Iska 10-12-2013 16:52 2270108

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 2270141

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

Iska 10-12-2013 18:03 2270154

Раз в вариантах поставки есть и zip-вариант, то можно и отдельно. Вот что говорит «Dependency Walker»:

pzh2393 10-12-2013 19:30 2270215

Цитата:

Цитата Опиум
У тебя есть вьювер, который ругается на опубликованный тобой файл? »

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

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

Ранее я спрашивал на основе каких параметров происходит определение именно для определения подходит ли мне такое решение.
Под описанную в шапке задачу программа подходит лишь частично, а хотелось бы универсальное решение.
Цитата:

Цитата Iska
c «ImageMagick» — всё нормально: »

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

kiripanda 10-12-2013 23:10 2270346

CMD с jpegtran.exe http://forum.wincmd.ru/viewpost.php?p=56916

Опиум 11-12-2013 10:03 2270518

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


Время: 00:57.

Время: 00:57.
© OSzone.net 2001-