Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Сфера Microsoft » Программное обеспечение Windows » Графика - Пакетная проверка кучи jpg/jpeg файлов на предмет повреждений

Ответить
Настройки темы
Графика - Пакетная проверка кучи jpg/jpeg файлов на предмет повреждений

Новый участник


Сообщения: 33
Благодарности: 2

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: jpg jpg_Bad.jpg
(188.8 Kb, 37 просмотров)
На форуме (да и на необъятных просторах сети) поднято множество тем по восстановлению потерянных/поврежденных фотографий, но иногда бывает нужно просто перебрать все графические файлы (наверно 99% - jpg) в каталогах и найти те, что пострадали. Пробовал различные пакетные конверторы (больше всех понравился IrfanView и FastStone), в надежде на получение списка файлов, содержащих ошибки, но все совершенно нормально открывали порченные файлы.

Это расстраивает по 2м причинам:
1. я был уверен, что должно быть великое множество средств диагностики графических файлов
2. может ли быть такое, что явное повреждение данных jpeg-файла не может быть диагностировано?

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

Просил одного знакомого программера сделать эксперимент - открыть средствами GDI заведомо битый JPG и посмотреть, возвращает ли библиотечка хоть какую-то ошибку, тогда можно было-бы написать небольшую програмку по проверки файлов из списка, с формированием списков хороших/поврежденных файлов, но тот уперся, сославшись, что если просмотрщик показывает битый JPG и не ругается, то и какой-нить "TJpegImage" не позволит обнаружить повреждение.

* прикладываю пример умышленно "битого" Jpeg`а, может кто чего попробует и посоветует?

Отправлено: 18:54, 17-06-2011

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Jr.Janitor, я тоже в своё время искал что-либо подобное, но ничего внятного не нашёл. Я ограничился таким способом:

1. Устанавливал ImageMagick, конкретно версию для работы с 8-битным цветом отсюда: ImageMagick: Install from Binary Distribution.

2. Использовал такой сценарий vbscript:
читать дальше »
Код: Выделить весь код
Option Explicit

On Error Resume Next

Const ERROR_SUCCESS = 0

Dim objArgs
Dim objImg
Dim strResult
Dim sMsgs

Set objArgs = WScript.Arguments

If objArgs.Count <> 1 Then
	WScript.Echo _
		"Usage:   " & WScript.ScriptName & " <FileNamesTemplate>" & vbCrLf & vbCrLf & _
		"Example: " & WScript.ScriptName & " ""c:\windows\*.bmp"""
	
	WScript.Quit 2
Else
	Set objImg = CreateObject("ImageMagickObject.MagickImage.1")
	
	strResult = objImg.Identify("-format", "Name:[%f] Type:[%m] Dim:[%wx%hx%z]\r\n", objArgs(0))
	'strResult = Replace(strResult, vbCrLf, " \n ")
	
	If Err.Number <> ERROR_SUCCESS Then
		ShowError
		Set objImg = Nothing
		WScript.Quit 1
	Else
		'WScript.Echo "NOERROR" & vbCrLf & strResult
		WScript.Echo strResult
		Set objImg = Nothing
		WScript.Quit 0
	End If
End If

'=========================================================================================
Sub ShowError
	sMsgs = ""

	If BasicError(Err.Number) > 5000 Then
		'sMsgs = " ImageMagickObject" & vbCrLf
	End If

	'WScript.Echo sMsgs & vbCrLf & Err.Number & ": " & Err.Description
	WScript.Echo Err.Description
End Sub
'=========================================================================================

'=========================================================================================
Function BasicError(e)
	BasicError = e And &HFFFF&
End Function
'=========================================================================================


3. Привязывал скрипт для выделенного файла в Far Manager посредством «User Menu» и макроса для проверки.

Выглядело в результате сие примерно так:
читать дальше »
Код: Выделить весь код
╔═════════════ Ошибок не обнаружено ═════════════╗
║ Name:[PageAll.jpg] Type:[JPEG] Dim:[616x166x8] ║
║                                                ║
╟────────────────────────────────────────────────╢
║                     { OK }                     ║
╚════════════════════════════════════════════════╝

Или так (Ваш файл):
читать дальше »
Код: Выделить весь код
╔═══════════════════════════════════ Найдены ошибки ════════════════════════════════════╗
║ identity: 325: Corrupt JPEG data: premature end of data segment `C:\attachment.jpg':  ║
║       identity: 325: Corrupt JPEG data: bad Huffman code `C:\attachment.jpg':         ║
║                                                                                       ║
╟───────────────────────────────────────────────────────────────────────────────────────╢
║                                        { OK }                                         ║
╚═══════════════════════════════════════════════════════════════════════════════════════╝


Подобным же образом у меня сделан скрипт на группу выделенных в Far Manager'е файлов. Приводить его не буду, ибо основная идея показана во втором пункте: попытка идентификации изображения, отлов возможной ошибки при этом, далее выход из скрипта с установлением нулевого/не нулевого кода ошибки, который затем используется во внешнем приложении (в данном случае — Far Manager'е) для отображения соответствующего сообщения, а как и чем будете пользоваться Вы — решать Вам.

К сожалению, в то время утилита «identify.exe» ImageMagick (как сейчас — не знаю) не устанавливала ненулевой код возврата при ошибке в изображении, а так можно было бы вполне обойтись без скрипта VBScript (в моём, понятно, случае), одним пакетным файлом с вызовом «identify.exe».

P.S. Вполне возможно, что я плохо искал, или что ситуация изменилась за прошедшее время, и коллеги посоветуют более простое решение.
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:33, 17-06-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Дополнение:

1. Jr.Janitor, если у Вас есть кто может написать — то можно использовать библиотеки ImageMagick для получения утилиты с потребной именно Вам функциональностью.

2. После поиска обнаружилось, что «identify.exe» всё-таки устанавливает errorlevel при использовании параметра «-regard-warnings»:
Код: Выделить весь код
C:\>"C:\Program Files\ImageMagick-6.3.4-Q8\identify.exe" -regard-warnings attachment.jpg 1>nul && echo 1 || echo 2
identify.exe: Corrupt JPEG data: premature end of data segment `attachment.jpg'.
identify.exe: Corrupt JPEG data: bad Huffman code `attachment.jpg'.
2

Последний раз редактировалось Iska, 18-06-2011 в 15:02. Причина: Был добавлен пропущенный предлог «с»

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:59, 17-06-2011 | #3


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Iska, у ImageMagick глобальная проблема с именами файлов нелатинницей. Приходилось запускать его через обёртку, которая переименовывает файл в латинницу, подаёт на вход IM'а, затем переименовывает обратно :-/

Отправлено: 20:15, 18-06-2011 | #4


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Busla, в каком смысле? Что выдаёт stdout в ANSI (1251)? Это да, есть такое, но не более. А в остальном нормально отрабатывает, что в скрипте, что в утилите «identify.exe».

А у Вас что не срабатывает (у меня старая версия — «ImageMagick 6.3.4»)? Можете привести пример?

Отправлено: 22:16, 18-06-2011 | #5


Новый участник


Сообщения: 33
Благодарности: 2

Профиль | Отправить PM | Цитировать


Iska, Огромнейшее спасибо!!!
1. Очень интересная библиотека. Жаль, что тяжелая и надо инсталлить, позже попробую их 8-битную портабельную версию.
2. Скачал текущую версию 6.7.0, в ней для отображения ошибок кроме -regard-warnings нужен еще и -verbose.

Мой сменщик помог с батником, закинул все домой РАдмином, запустил, теперь буду ждать результата.
вот такой скрип получился:
Код: Выделить весь код
@Echo off
setlocal EnableExtensions

set IM="%ProgramFiles%\ImageMagick-6.7.0-Q8\identify.exe"
set WD="%1"
if not defined WD set WD="%CD%"
set Log="%CD%\%~n0.txt"
set N=0
set T=0
set P=.
set CR=

pushd %WD%
for /f "tokens=1 delims=" %%F in ('dir /a-d /b /s') do call :Check "%%F"
popd
echo Corrupted or unknown formats: %N%/%T%
goto :End

:Check
if not "%P%"=="%~dp1" (set P=%~dp1
echo %~dp1
)
if "%T:~-1%"=="0" set /P nul=%N%/%T%%CR%<nul
set /a T+=1
%IM% -verbose -regard-warnings %1>nul 2>nul || (
echo %~1>>%Log%
set /a N+=1
)
exit /b

:End

Последний раз редактировалось Jr.Janitor, 21-06-2011 в 17:16.


Отправлено: 14:29, 21-06-2011 | #6


Новый участник


Сообщения: 33
Благодарности: 2

Профиль | Отправить PM | Цитировать


Батник пришлось доводить до ума... потерял лишние 2-3 дня - вываливался, гад.
Теперь для экономии времени и нервов, в начале сохраняет каталог в файлик (все в текущем каталоге, так что с поврежденного диска не запускать!), и если файлик имеется, то используется уже готовый (экономится примерно 15 минут времени запуска). Далее добавил срез данных (ну, всего-то 2 параметра - кол-во найденных ошибок и последний проверянный файл по сохраненному каталогу), как в старые добрые времена, когда машины висли каждые 2 часа
Так же улучший отображаемую на экран инфу - тек. каталог, штамп времени и счетчики файлов.
Проверяется уже 4е сутки без сбоев, на вторые сутки устал от воя кулера, запустил Эверест - оказалось, температура проца 81 градус (АМД), диска - 65 (ИБМ). Срочно принял меры, сейчас, температура не поднимается выше 75/56 (проц/диск). Текущая статистика - 3125 битых из 85280 проверянных (всего почти 313тыс). Большая часть по списку - спотыкания об кириллицу - меня особо не беспокоит, ибо не мои это фотки, у меня все имена исключительно латиницей. Через неделю жду окончательный вердикт.

Правленный батник:
Код: Выделить весь код
@Echo off
setlocal EnableExtensions

set IM="%ProgramFiles%\ImageMagick-6.7.0-Q8\identify.exe"
set WD="%1"
if not defined WD set WD="%CD%"
set Log="%CD%\%~n0.txt"
set Lst="%CD%\%~n0.lst"
set Stat="%CD%\%~n0.stat"
set N=0
set T=0
set CR=
if exist %Stat% for /f "usebackq tokens=1,2" %%N in (%Stat%) do set N=%%N & set T=%%O
if %T%==0 (set P= ) else set P=skip=%T%

pushd %WD%
if not exist %Lst% dir /a-d /b /s *.jpg>%Lst%
for /f "usebackq %P% tokens=1 delims=" %%F in (%Lst%) do call :Check "%%F"
popd
echo Corrupted or unknown formats: %N%/%T%
goto :End

:Check
echo %N% %T% %date% %time%>%Stat%
if not "%P%"=="%~dp1" set "P=%~dp1" & echo %date% %time%	%~dp1
set /P nul=%CR%%N%/%T%	<nul
set /a T+=1
%IM% -verbose -regard-warnings %1>nul 2>nul
set Err=%ErrorLevel%
if %Err%==1 echo %~1>>%Log% & echo %~1
if %Err%==1 set /a N+=1
exit /b

:End
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:47, 29-06-2011 | #7


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Jr.Janitor:
Большая часть по списку - спотыкания об кириллицу »
Busla выше не ответил на мой вопрос. А что у Вас не так с кириллицей?

У Вас задача, оказывается, совсем другая, нежели решал я — Вам нужна была полная проверка всех наличествующих *.jpg файлов. Теперь стало ясно.

Отправлено: 05:44, 30-06-2011 | #8


-!-


Сообщения: 3792
Благодарности: 224

Профиль | Отправить PM | Цитировать


Попробовал последний скрипт с ImageMagick-6.7.1-Q8. 80% провернных фото посчитал корявыми или неизвестными (Corrupted or unknown formats), хотя при просмотре искажений не наблюдаю.

Отправлено: 12:30, 14-07-2011 | #9


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


dascon, а для одиночного файла, одного из тех, что как бы «Corrupted or unknown formats», скрипт из #2 что «говорит»?

Отправлено: 16:13, 14-07-2011 | #10



Компьютерный форум OSzone.net » Сфера Microsoft » Программное обеспечение Windows » Графика - Пакетная проверка кучи jpg/jpeg файлов на предмет повреждений

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Вирус зашифровал doc,xls,rar,zip,jpeg,jpg,psd gamber Лечение систем от вредоносных программ 3 05-11-2009 16:49
CMD/BAT - Проверка на предмет установленного SP3 Cibersoft Prolex Скриптовые языки администрирования Windows 1 07-05-2009 09:03
Размеры файлов JPEG в вертикальном и горизонтальном соотношении Absolut Хочу все знать 6 01-08-2005 01:00
преобразование jpg в jpeg strannic2005 Хочу все знать 7 27-12-2004 19:19
Пакетная конвертация или преобразование графических файлов UTU Программное обеспечение Windows 12 09-06-2004 19:55




 
Переход