Инструкция по использованию JPEGfix

Актуальна для версии 1.1.35 от 2015-11-14

Продвинутые пользователи, желающие сразу приступить к ремонту файлов, могут начинать сразу с раздела 6. Пример ремонта файла

Содержание

Инструкция по использованию JPEGfix

Содержание

1. Общие сведения

2. Дистрибутив

3. Оценка пригодности файла к ремонту

3.1. Оценка файла сканированием

3.2. Оценка файла по байтовой и 2-байтовой статистике

3.3. Оценка файла упаковкой в архив

3.4. Оценка файла обычной загрузкой

3.5. Оценка файла загрузкой scan data

3.6. Оценка файла загрузкой scan data с заголовком от хорошего файла

3.7. Подведение итогов

4. Принцип ремонта

4.1. Загрузка данных с правильным заголовком

4.1.1. Загрузка файла с корректировкой маркеров

4.2. Исправление искажений

4.3. Порядок ремонта в JPEGfix

5. Описание интерфейса

5.1. Меню

5.2. Контекстное меню

5.3. Дополнительные окна

5.3.1. Errors

5.4. Управление с клавиатуры

6. Пример ремонта файла

7. Более сложный ремонт

7.1. Быстрый ремонт без годного заголовка

8. Устройство файлов JPEG

8.1. Последовательность маркеров

8.2. Представление информации

9. Что делать, чтобы не потерять ценные данные?

1. Общие сведения

Программа JPEGfix предназначена для ремонта повреждённых файлов формата JPEG (JPG). Программа позволяет исправить мелкие искажения, вызванные сбоями хранения файлов и собрать из уцелевшей информации файл, который будет можно будет смотреть, обрабатывать, печатать и т.п.

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

Также программа содержит инструменты для анализа пригодности файла к ремонту, для выгрузки DCT-коэффициентов или YCbCr растра (для обработки в иных программах).

bad_jpeg.jpg

Типичные повреждения, которые бывает можно исправить -
искажение цвета, сдвиг и сбой декодирования типа  “серый низ”.

Автор рекомендует не использовать программу на последней копии файла - если вы восстанавливаете ценные для вас файлы - сделайте ещё одну копию, не экономьте место и время.

Программа предоставляется “AS IS” - как есть, без каких бы то ни было гарантий надёжности, пригодности и т.д. Распространение и использование программы разрешается на некоммерческой основе. Подробнее - см. файл License.txt в дистрибутиве.

Находящийся в дистрибутиве файл DCTdraw.dll - библиотека быстрого вывода изображения.

Утилита поддерживает файлы формата JPEG (*.JPG, *.JPEG), а также позволяет искать файлы и фрагменты данного формата внутри других файлов, например образов дисков. Поддерживается работа только с файлами объёмом меньше 2ГБ (более крупные файлы нужно нарезать, а образы дисков можно снять не целиковые, а по диапазонам секторов)

2. Дистрибутив

Последняя версия - 1.1.35 от 2015-11-14

Скачать программу можно по ссылкам, находящимся на домашней странице программы:

http://overquantum.livejournal.com/9832.html

3. Оценка пригодности файла к ремонту

Перед тем, как приступать к ремонту рекомендуется сделать несколько проверок файла, позволяющих оценить, имеет ли смысл делать ремонт и если да, то какой.

3.1. Оценка файла сканированием

JPEGfix содержит инструментарий по поиску в файле фрагментов JPEG данных.

  1. Меню “Analyze” -> “Scan file for JPEG” и выбрать файл
  1. Отобразится графическая оценка пригодности файла к ремонту (чёрный прямоугольник с узором из разноцветных точек на окне программы), а также текстовая оценка в виде всплывающего сообщения.
  1. Текстовая оценка содержит проценты данных - похожих на JPEG (JPEG data), явно не JPEG (Not JPEG data) и непонятных (Unknown data).
  1. "Непонятные" могут оказаться как JPEG так и нет, но если их много - они не JPEG.
  2. Какая часть изображения уцелела - вам примерно подскажет процент JPEG data.
  1. После текстовой оценки даётся предварительный вывод:
  1. "LOOK LIKE CORRECT JPEG" - либо правильный JPEG-файл, либо что-то очень на него похожее, не более 10% повреждений;
  2. "DAMAGED JPEG" - до 30% файла пострадало, но остальное, скорее всего, подлежит восстановлению;
  3. "SERIOUSLY DAMAGED JPEG" - до 60% файла пострадало;
  4. "SMALL FRAGMENTS OF JPEG" - от JPEG осталось от 10% до 40%, может быть, из них удастся что-то собрать;
  5. "Possibly NOT A JPEG" - от JPEG осталось не более 10%, вряд ли что-то можно восстановить;
  6. Примечания:
  1. Оценка заточена под большие JPEG-файл, для файлов меньше 200 килобайт оценка может оказаться хуже, чем дело обстоит на самом деле)
  2. Высокий процент JPEG data и хороший вердикт может быть и у файла, который содержит фрагменты нескольких снимков. Особенно это актуально для файлов, восстановленных после удаления.
  1. Графическая оценка для нормального JPEG-изображения (или хорошо восстановимого) выглядит как хаотичный узор из зелёных точек с небольшим количеством белых (и, может быть, красных и фиолетовых) точек и чёрточек в самом верху.

  1. Повреждения изображения выглядят примерно так:

Горизонтальные полосы без зелёных точек (тёмно-зелёный или чёрный фон)

Горизонтальные полосы с узором из красных/белых/фиолетовых точек

Сплошные горизонтальные красные или фиолетовые полосы

Горизонтальные полосы с пёстрым узором фиолетовых оттенков

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

  1. Если весь прямоугольник чёрный и без зелёных точек или весь покрыт красными/белыми/фиолетовыми точками - изображение не восстановимо.
  2. Если узор состоит из зелёных точек, но он явно повторяющийся (как обои) сверху вниз - скорее всего, изображение не восстановимо.

  1. Графическую оценку можно двигать клавишами-стрелками на клавиатуре, особенно это полезно, если она больше экрана.
  1. Возврат оценки на центр - меню Draw -> Center Image

Техническая информация: Одним пикселем в графической оценке кодируется 1 байт файла.

Зелёные точки - байты FF 00, а также FF D0 .. FF D7 - тэги, допустимые в теле JPEG-изображения. Зелёные точки должны встречаться с частотой примерно 1 зелёная точка на 255 чёрных пикселей.

Белые точки - остальные тэги в диапазоне от FF C0 до FF FE - описательные тэги, допустимые в начале и конце JPEG-файла. В средине их быть не должно.

Красные точки - остальные тэги, запрещённые в JPEG-файле. Красные точки могут быть и в нормальном JPEG-файле - байты внутри таблиц квантования и таблиц Хаффмана могут содержать FF и отображаться как красные точки.

Точками фиолетовых оттенков отображаются байты, коррелирующие между собой (т.е. содержащие избыточность). Чем ярче цвет - тем лучше корреляция (т.е. выше избыточность). Байты JPEG почти совсем не должны коррелировать между собой (т.е. не должны содержать избыточность), поэтому пёстрые узоры из фиолетовых точек - явно не данные JPEG, даже если среди них есть зелёные.

  1. Пункт меню Analyze -> "Scan folder for JPEG..." позволяет просканировать все файлы каталога и записать результаты в файлы.
  1. Вам нужно будет выбрать любой файл в нужном каталоге и файл, куда сохранить результаты - они будут в виде текстового файла - имя файла, раскладка по объёмом (JPEG data / Not JPEG data / Unknown data) и предварительный вывод.
3.2. Оценка файла по байтовой и 2-байтовой статистике

Ещё одним способом оценки пригодности файла к ремонту является байтовая статистика. Статистика позволяет отличить некоторые случаи повреждения файлов от корректных данных JPEG, а также позволяет быстро определить несколько типичных вариантов повреждений:

  1. Заполнение файла одинаковым байтом (возникает при сбое носителя информации, обычно это байт 00 для CD/DVD и FF на флеш-картах и флеш-дисках)
  2. Заполнение файла коротким повторяющимся фрагментом (возникает при некоторых сбоях карт памяти, обычно длина фрагмент от 512 байт до 32 килобайт)
  3. Замена содержимого файла посторонними данными другого формата (видео, архив, музыка и т.д.)

JPEGfix поддерживает два варианта статистики:

  1. Байтовая статистика вызывается через меню “Analyze” -> “Byte statistic of file” и выбор анализируемого файла
  2. В окне программы отобразится графическая гистограмма и численные значения в 2 столбца
  1. В каждом столбца последовательно указаны:
  1. Десятичное представление значения байта,
  2. Шестнадцатеричное представление,
  3. % встречаемости байта в файле по отношению к полному объёму файла,
  4. Общее количество байт данного значения в файле
  1. Байтовая статистика для нормального JPEG-изображения (или хорошо восстановимого) выглядит как примерно равномерное распределение всех байт, кроме 00 (которого заметно больше), возможно с несколькими всплесками из-за флюктуаций.

img_8423_1stats.png

  1. Типичные повреждения:
  1. Файл состоит только из байтов FF (на 100%) - ничего не спасти. Если любой байт заполняет файл на 100% - это означает полную потерю полезной информации из этого файла.

stats_FF.png

  1. Текстовый файл использует только ограниченное количество байт. Такая или похожая статистика означает, что содержимое файла было заменено на что-то, явно не являющееся JPEG, и изображение из файла восстановить скорее всего невозможно.

text_stats.png

  1. 2-байтовая статистика вызывается через меню “Analyze” -> “2-byte statistic of file” и выбор анализируемого файла
  2. В окне программы отобразится двумерная гистограмма, в которой цветом представлена частота встречаемости 2-байтовой комбинации
  1. По горизонтали отложен первый байт
  2. По вертикали - второй
  3. Чёрный цвет - комбинация не встречается, белый - данная комбинация встречается наиболее часто, ярко зелёный - комбинация встречается около 10% от максимально частой
  1. 2-байтовая статистика для нормального JPEG-изображения (или хорошо восстановимого) выглядит как зелёный узор, отдалённо напоминающий ткань или печатную плату.

img_8423_stats.png

  1. Характерная особенность JPEG - белая точка с правом верхнем углу и чёрная вертикальная полоса под ней:

img_8423_stats_corner.png

Техническая информация: белая точка в данном случае отображает комбинацию FF 00,, черная полоса под ней - почти полное отсутствие комбинаций FF с другими байтами, в соответствии с форматом JPEG

  1. Некоторые форматы файлов имеют довольно характерные узоры 2-байтовой статистики, позволяющие отличить их друг от друга
  1. Шифрованные файлы выглядят как “белый шум”, 2-байтовая статистика - полностью равномерный хаотичный узор белого и бледно-зеленых оттенков:

encr.jpg

  1. Архивы (rar, zip и т.д.) имеют тоже примерно равномерный узор, однако иногда проявляются некоторые особенности, вроде чуть выделяющихся вертикальных или горизонтальных линий:

rar.jpg

  1. AVI-видео, особенно со старых фотоаппаратов, имеют довольно характерную диагональную полосу:

avi.jpg

  1. MOV-видео имеет почти равномерный узор и чуть более яркий левый верхний угол:

mov.jpg

  1. RAW-снимки в целом похожи на JPEG, однако некоторые имеют характерные полосы из-за более часто встречающихся байт 08-0A (это также видно на байтовой гистограмме). В данном случае CR2:

cr2_stats.jpg

  1. Узор WAV формата очень равномерный, имеет тёмный центр и более светлые края:

wav.png

  1. HTML, XML, FB2 и прочие текстовые форматы используют ограниченный набор байт, поэтому их узоры сильно вырождены до небольших прямоугольных полей:

html.jpg

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

512repeat.png2k_repeat.png32k_repeat.png

  1. Пример узора неустановленных данных, обнаруженных в нескольких случаях повреждения файлов в 2013-2014 годах (в двух случаях - с телефонами Samsung):

20130816_014017_jpg_2b.jpg

3.3. Оценка файла упаковкой в архив

Ещё одним способом проверки файла на типичные варианты повреждения является упаковка в архив. Она также позволяет обнаружить повреждения типа заполнения файла одинаковым байтом или повторяющимся фрагментом (не обязательно коротким), а также оценить максимальный % данных JPEG, которые могли сохранить в файле.

Упаковка в архив не входит в функционал JPEGfix, для этого вам потребуются сторонние программы - WinRar, 7zip и т.д.

  1. Инсталируете и запускаете программу архивации, если у вас её ещё нет.
  2. Выбираете пострадавший файл (или несколько) и упаковываете их с максимальной степенью сжатия.
  1. В WinRar: "Compression Method" - "Best"
  1. Заходите в созданный архив и сравниваете оригинальный объём каждого файла (колонка "Size") и упакованный объём (колонка "Packed").
  2. Правило простое - информации в файле не больше, чем упакованный объём файла. Возможные варианты:
  1. Упакованный объём файла составляет от нескольких десятков байт до нескольких десятков килобайт; тогда как оригинальный объём файла - несколько мегабайт. Это означает, что содержимое файла утрачено полностью. Файл либо весь состоит из одинаковых байт или повторяющегося фрагмента небольшой длины, либо почти весь.
  2. Упакованный объём файла составляет от 5% до 90% оригинального объёма файла. Это означает, что часть файла утрачена - столько, сколько недостаёт до полного оригинального объёма файла. Но остальное - могло уцелеть.
  3. Упакованный объём файла не менее 90% оригинального объёма файла. Это означает, что содержимое файла могло уцелеть.
  4. Исключение может быть в случае изображений, содержащих большие области однородной окраски. Такие области могут кодироваться в JPEG-файлах в виде повторяющейся последовательности байт и подвергнуться существенной упаковке архиватором. Для таких файлов даже не пострадавший файл может иметь заметно меньший упакованный объём, чем оригинальный.

Важное замечание: оценка упаковкой никоим образом не оценивает, является ли уцелевшая информация в файле JPEG-изображением или чем-то ещё. Даже если упакованный объём файла точно равен оригинальному, файл может содержать фрагменты файлов других форматов - видео, архивов и т.п.

3.4. Оценка файла обычной загрузкой

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

  1. Меню "Main"->"Load JPEG" и указать пострадавший файл.
  2. Если программа зависает или выдаёт ошибку - переходите к шагу 3.6
  3. Если изображение пострадало не сильно (обычные программы отображают вид "нижняя половина серая"), то скорее всего вы увидите всё изображение, но его часть или несколько частей его могут иметь другой цвет и быть сдвинуты относительно нормального положения.
  1. Это означает, что изображение довольно просто можно починить. При сильном везении может даже не проявиться искажение цвета и сдвига.
  2. Если необходимо - отобразившуюся картинку можно сохранить в файл формата BMP - меню "Main"->"Save displayed as BMP".
  1. Если изображение пострадало сильно, или повреждение пришлось на заголовок изображения (или повреждение выглядит как заголовок) - вы увидите только часть изображения или разноцветный мусор или вообще серый фон. В этом случае - переходим к пункту 4.
3.5. Оценка файла загрузкой scan data

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

  1. Меню "Main"->"Load JPEG" и указать пострадавший файл
  2. После загрузки изображения, выбрать меню "Main"->"Advanced load JPEG" и снова указать этот же пострадавший файл.
  3. В появившемся окне Markers нажать кнопку “Load scan data”
  1. JPEGfix загрузит весь файл как поток данных JPEG (scan data), используя заголовок загруженный ранее. Это позволяет обойти любые повреждения информации, однако при таком подходе иногда искажается цвет изображения даже непострадавших фрагментов (а в редких случаях - непострадавшие фрагменты могут не отобразится совсем).
  1. Весь файл может не влезть в отображаемое окно, имеет смысл вызвать меню "Main"->"Next page", при этом декодирование продолжится с того места, где оно остановилось внизу окна - отобразится как бы следующая страница. Так можно "листать" даже очень большой файл, например, образ флешки или лазерного диска.
  1. Можно сохранить фрагмент файла, отображаемый на текущей “странице” - например, если вы нашли нужный вам фрагмент изображений в большом файле.
  1. Используйте меню Main -> Export -> Current page in binary.
  2. Программа предложит сохранить файл с суффиксом в виде шестнадцатеричного смещения на начало страница (например sectordump_0039B069.dat).
  3. В сохраняемый файл будут записано только байты из листаемого файла без заголовка, для просмотра этого файла необходимо будет использовать корректный заголовок - см. п. 3.6.
  1. Во время декодирования появляется индикатор Loading (%), если он доходит до 100% и исчезает - файл декодировался до конца. Если не доходит до 100% - можно продолжать жать "Next page".
  2. Файлы объёмом 2ГБ и больше не поддерживаются (совсем).
  1. Навигация по изображению
  1. JPEGfix поддерживает масштабы просмотра 1:8, 1:4, 1:2 и 1:1. По умолчанию он подбирает масштаб для наилучшего отображения.
  2. В меню "Draw", пункты "Redraw ..." - выполняют отрисовку изображения в указанном масштабе. Пункты "Show ..." - только переключают между отрисованными изображениями разного масштаба.
  1. Если изображение отрисовывается не целиком, возможно вы случайно выделили его фрагмент и отрисовывается только он. Нажмите Esc для сброса выделения.
  1. Изображение можно двигать стрелками на клавиатуре и возвращать на центр окна через меню "Draw"->"Center Image".

Меню "Draw"->"Display MCU len" показывает в условных цветах относительные размеры блоков изображения в битах - тёмные блоки занимают мало места, светлые - много.

См. также ниже п. 4.1.1. Загрузка файла с корректировкой маркеров

3.6. Оценка файла загрузкой scan data с заголовком от хорошего файла

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

  1. Найти непострадавший файл с изображением, которое максимально похоже на пострадавшее.
  1. Если пострадал фотоснимок - нужно найти снимок сделанный по возможности тем же фотоаппаратом, с тем же качеством сжатия, размером кадра (в пикселях), ориентацией и балансом белого, как и пострадавший.
  2. Если пострадало изображение, сохранённое из графического редактора - желательно найти изображение, сохранённое этим же редактором с такими же настройками сжатия.
  1. Загрузить непострадавший файл через меню "Main"->"Load JPEG"
  2. "Main"->"Advanced load JPEG scan data" и указать пострадавший файл
  3. В появившемся окне Markers нажать кнопку “Load scan data”
  1. JPEGfix загрузит весь файл как поток данных JPEG (scan data), используя заголовок загруженный из непострадавшего файла. Это позволяет обойти повреждения заголовка в пострадавшем файле, однако при таком подходе нет строгой уверенности, что заголовок из непострадавшего файла подойдёт для декодирования пострадавшего.

Техническая информация: Должны подойти таблицы квантования, таблицы Хаффмана и размеры изображения в пикселях.

Неправильные таблицы квантования приведут к искажению контраста изображения, искажению резкости и проявлению мозаики 8х8 пикселей.

Неправильные размеры приведут к распаду изображения на почти несвязанные между собой полоски высотой 8 или 16 пикселей.

Неправильные таблица Хаффмана в большинстве случаев приведут к полному превращению изображения в цветовой мусор. В связи с этим почти нереально восстановить изображения с адаптивными таблицами Хаффмана, если эти таблицы пропали/пострадали.

  1. Листание файла и сохранение текущего фрагмента - см выше 3.5.4.
  2. Навигация по изображению - см. 3.5.5.

См. также ниже п. 4.1.1. Загрузка файла с корректировкой маркеров

3.7. Подведение итогов
  1. Если оценка сканированием (см. 3.1 выше) показывает результаты "SERIOUSLY DAMAGED JPEG" или "SMALL FRAGMENTS OF JPEG" или "Possibly NOT A JPEG" - шансов на восстановление изображения очень мало. На восстановление полноценного изображения - почти нет.
  2. Если оценка байтовой статистикой (см. 3.2 выше) показывает, что 100% файла состоит из одного байта - файл не подлежит восстановлению.
  3. Если оценка байтовой или 2-байтовой статистикой показывает результат, далёкий от нормального JPEG файла - шансов на восстановление изображения мало.
  4. Если оценка сканированием и стастистиками показывают хороший результат, а попытки просмотра (3.4-3.6) ничего не дают, есть две возможности:
  1. У изображения утрачена таблица Хаффмана, без которой отобразить файл практически нереально. Возможно, стоит вернуться к пункту 3.6 и попробовать другие непострадавшие файлы, похожие на пострадавший.
  2. Это не JPEG-изображение, а файл, похожий по формату.
  1. Всё, что удалось увидеть при той или иной загрузке изображения - подлежит восстановлению. Даже если отображается в искажённом цвете или сдвинуто в сторону.
  2. Отобразившуюся картинку можно всегда сохранить в файл формата BMP - меню "Main"->"Save displayed as BMP".
  3. Изображение также можно сохранить в файл формата JPEG - меню "Main"->"Save JPEG..."
  1. Предварительно необходимо включить пункт Override->Restructure JPEG on save, если вы загружали scan data (рекомендуется сделать и в других случаях, но это приводит к несохранению EXIF).

4. Принцип ремонта

Ремонт файла в общем случае состоит из двух этапов:

  1. Загрузка данных с правильным заголовком
  2. Исправление искажений
4.1. Загрузка данных с правильным заголовком

Загрузка данных с правильным заголовком необходима только в случае существенных искажений, когда страдает и утрачивается заголовок файла. Заголовок содержит важную информацию для декодирования изображения - размеры в пикселях, структуру MCU-блоков, таблицы квантования и таблицы Хаффмана.

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

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

Прочие параметры заголовка (размеры, структура MCU, таблицы квантования) могут быть подобраны в процессе ремонта, однако отсутствие правильных таблиц Хаффмана не позволяет выполнить ремонт.

4.1.1. Загрузка файла с корректировкой маркеров

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

  1. Открываете файл через расширенную загрузку
  1. Main -> Advanced load JPEG
  1. После выбора файла появится окно Markers, пустое. Жмите кнопку Load Markers
  2. Окно Markers заполнится перечнем маркеров в файле. В случае сбоев, список может быть, например, таким:
  1. Всё что находится после первого маркера SOS и до EOI в конце файла - как правило лишнее, является следствием искажения файлов и причиной сбоев вида “половину видно, а дальше всё серое”. Выберите все эти маркеры
  1. Клик на первый лишний маркер
  1. В примере это “0001502F (0), 0xA0 - RESxA0...”
  1. Удерживая шифт, клик на последний лишний маркер
  1. В примере это “00265B95 (0), 0x87 - RESx87...”
  1. Удалите все выделенные маркеры
  1. Кнопка DELETE
  1. Список примет вид, корректный для файла JPEG, примерно такой:
  1. Жмите OK
  2. Изображение загрузится

Если вы затрудняетесь определить какие маркеры лишние - попробуйте альтернативный способ после шага 3::

  1. Нажмите кнопку “Error after good header
  2. Все лишние маркеры (а также последний EOI) будут отмечены как “(treat as data, non-decoded, not-saved, )”
  3. Выберите их все
  1. Клик на первый лишний маркер
  2. Удерживая шифт, клик на последний лишний маркер
  1. Удалите все выделенные маркеры
  1. Кнопка DELETE
  1. Жмите OK
  1. Изображение загрузится

Примечание: Маркеры APP0-APP15 являются информативными (содержат Exif и т.п.), наличие их в заголовке не является сбоем, несмотря на отметку “unsupported”.

Типичная структура корректного JPEG-файла: SOI, APP1, DQT (до 2-х), SOF0, DHT (до 4-х), SOS, EOI. Между SOS и EOI в не прогрессивном изображении могут находится только маркеры RST, всё остальное является лишним. См. также раздел 8.1.

4.2. Исправление искажений

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

  1. Часть данных утрачена
  2. Вставлены чужеродные данные
  3. Искажён цвет изображения после сбоя (правее и ниже точки сбоя).

В первых двух случаях изображение сдвигается на некоторое количество MCU-блоков - обычно влево при утрате данных и вправо при вставлении. При сдвиге часть изображения прокручивается через левый/правый край и становится виден вертикальный шов - граница между левой и правой частями настоящего изображения.

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

  1. Вместо утраченные данных вставляются пустые блоки - серого цвета. Чужеродные данные просто вырезаются. Оба типа искажения исправляются инструментом “Redecode with shift...”, однако пользователю необходимо задать величину сдвига, т.к. программа не может определить величину сдвига сама. Для больших сдвигов удобнее использовать инструмент "Mrk1-2 to EOL", в этом случае пользователю необходимо установить 2 маркера - 1й где начались хорошие данные после сбоя и 2й - перед вертикальным швом (граница левой и правой частями изображения).
  2. Искажение цвета устраняются корректировкой т.н. DC-компоненты MCU-блока (сбой декодирования которой и вызывает искажение цвета). Наиболее удобный инструмент для корректировки цвета - "Auto color". Подбор корректировки всех цветовых компонентов программа выполнит сама, пользователю необходимо только задать отрезок на границе между правильным изображением и искажённым.

4.3. Порядок ремонта в JPEGfix

При наличии правильного заголовка (см. выше) ремонт изображения состоит в следующей последовательности действий для каждого сбоя::

  1. Найти точку сбоя
  1. Нужно найти первый MCU блок, который имеет неправильный цвет или некорректное изображение (как правило очень контрастное и с элементами шахматного узора или их узких полосок)
  2. Если начало изображения пострадало, тогда сбойным будет самый первый блок и не будет возможности связать цвет (ниже).
  1. Определить величину сдвига
  1. При сдвиге обычно образуется хорошо видимый шов между левой и правой частями настоящего изображения. Величина сдвига равна расстоянию от края до этого шва.
  1. Указать программе величину сдвига
  1. Первый вариант - поставить маркеры, Mrk1 на первый хороший блок после сбоя (он может иметь искажение цвета, но при этом правильный узор и является единым целым с последующим изображением) и Mrk2 на блок слева от шва между левой и правой частями настоящего изображения (этот блок исходно был последним в строке, где находится первый хороший блок после сбоя). Инструмент "Mrk1-2 to EOL" выполнит корректировку сдвига, так что маркер Mrk2 окажется в конце строки, а маркер Mrk1 - максимально при этом близко к началу сбоя.
  2. Второй вариант - оценить величину сдвига в блоках вручную и использовать непосредственно иструмент “Redecode with shift...”, задав сдвиг. Положительный сдвиг ликвидирует чужеродные данные (и сдвиг вправо), отрицательный - вставляет серые блоки (ликвидирует сдвиг влево).
  1. Найти отрезок по которому можно связать цвет до сбоя и после
  1. Отрезок должен лежать на границе между правильным изображением до сбоя и нормальным после сбоя, отрезок должен содержать более-менее равномерный цвет или узор близкий к вертикальному. Корректировка цвета считается по двум строчкам пикселей сверху границы и двум снизу, наличие наклонных или горизонтальных линий на этом отрезке вблизи границы сбивает алгоритм вычисления корректировки. В случае затруднений можно выбирать отрезки побольше, но нельзя выбирать отрезки, имеющие сверху или снизу хоть один сбойный блок (с узором, не относящимся к исходному изображению).
  1. Выполнить корректировку цвета
  1. При хорошо заданном отрезке для связывания инструмент "Auto color" полностью ликвидирует искажение цвета
  1. Декодировать изображение в правильном виде до следующего сбоя
  1. Инструменты “Redecode X more lines” и т.п.

Начинать необходимо с самого верхнего сбоя (и с самого левого, если есть более одного сбоя в одной строке) и двигаться вниз (и вправо).

Пример ремонта рассматривается в разделе 6.

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

1) Попытаться подобрать корректировку, которая приводит к нормальному балансу белого и не приводит к пересвету и недосвету.

2) Нормализовать начало изображения после сбоя. Если в этом начале есть белое и чёрное, нормализация даст хороший результат.

5. Описание интерфейса

5.1. Меню

Наиболее полезные пункты выделены полужирным.

  1. Меню Main - основные действия
  1. Load JPEG - загрузка JPEG файла простым способом
  2. Advanced load JPEG - загрузка JPEG с дополнительными настройками
  3. Save JPEG - сохранение файла в формате JPEG
  4. Подменю Export - сохранение в другие форматы
  1. Displayed image as BMP - сохранение видимой картинки (с учётом масштаба!) в BMP
  2. Export header in JSON - сохранение только заголовка в JSON формате.
  3. Export YCbCr bitmap - сохранение растра в YCbCr цветах в бинарном виде
  4. Export YCbCr in JSON - сохранение растра в YCbCr цветах в формате JSON
  5. Export DCT binary - сохранение DCT-коэффициентов в бинарном виде
  6. Export DCT in JSON - сохранение DCT-коэффициентов в формате JSON
  7. Export current page in binary - сохранение текущей страницы в бинарном виде, актуально для поиска изображений внутри образов дисков и других больших файлов
  1. Import DCT binary - загрузка DCT-коэффициентов из бинарного формата
  2. About - о программе
  3. Exit - выход
  1. Меню Override - разные настройки по
  1. Override width - задать ширину изображения для следующей загрузки файла (0 - использовать ширину из загружаемого файла)
  2. Override height - задать высоту изображения для следующей загрузки файла (0 - использовать высоту из загружаемого файла)
  3. Restructure JPEG on save (флаг) - при сохранении формировать JPEG наиболее стандартной структуры, выкинув всё лишнее и игнорируя структуру исходного файла. EXIF сохранён не будет.
  1. Если флаг не установлен, при сохранении будет сохраняться структура исходного файла
  1. Ignore RST (псевдофлаг) - игнорировать RST маркеры при загрузке.
  2. Log settings - задать битовые флаги того, что сохраняется в лог при загрузке JPEG и при сохранении
  3. Manage markers - вызвать окно управления маркерами
  4. Input marker - ввести маркер вручную. Полезно для ручного задания таблиц квантования, Хаффмана и т.д.
  5. Next page - декодировать изображение дальше, если все данные не уместились в отображаемую “страницу”
  6. Redecode from header - перезагрузить текущее изображение от заголовка
  7. Redecode from SOS - перезагрузить текущее изображение от маркера SOS (т.е. не перезагружать данные заголовка - таблицы и т.п.)
  1. Меню Repair - некоторый ремонт
  1. Next error - поискать следующий сбой на изображении (устаревший пункт меню)
  2. Remove shift by borders - устранить сдвиги изображения по проставленным вручную отметкам о крае изображения
  3. Remove shift by borders and delim - устранить сдвиги изображения по проставленным вручную отметкам о крае изображения и точках сбоев
  4. Check borders - проверить отметки о крае изображения и точках сбоев
  5. Normalize image by lines - нормализовать искажённый цвет по строкам изображения. Рекомендуется применять только в случае сильного искажения цвета для выявления деталей (и определения что это вообще за изображение)
  6. Load borders - загрузить отметки о крае изображения из файла
  7. Save borders - сохранить отметки о крае изображения из файла
  8. Cursor mode - режим “курсора” для проставления отметок о крае изображения
  1. Меню Draw - отрисовка изображения
  1. Redraw 1:... (...) - отрисовать изображение в указанном масштабе и указанным способом
  2. Display MCU len - отобразить длины MCU-блоков в чёрно-зелёно-белой градации
  3. Display Debug info - отобразить отладочную информацию
  4. Display DCT coefficient - отобразить изображение только по одному из DCT коэффициентов
  5. Display errors - отобразить сбои декодирования
  1. Меню Analyze - средства анализа изображения
  1. Scan file for JPEG - искать в файле данные, выглядящие как JPEG
  2. Scan folder for JPEG - проверить все файлы в каталоге на данные, выглядящие как JPEG
  3. Byte statistic of file - посчитать байтовую статистику файла
  4. 2-byte statistic of file - посчитать двух-байтовую статистику файле (частоту использования пар байтов)
  5. Show MCU info - включить дополнительное окно, отображающее информацию об MCU блоках
  6. Save loading log - сохранить лог загрузки в файл (предлагается рядом с загруженным JPEG-ом)
5.2. Контекстное меню

(текст в процессе подготовки)

5.3. Дополнительные окна
5.3.1. Errors

Окно вызывается из меню Repair->”Next error…”, либо при через контекстное меню “Repair this MCU” у MCU-блока изображения.

Окно является основным средством ремонта искажения цвета и сдвига.

  1. Выпадающий список - содержит перечень ошибок, возникших при декодировании изображения (имейте ввиду - не каждая ошибка приводит к искажению изображения и далеко не каждой сбой, искажающий изображение, приводит к ошибке декодирования).
  2. Кнопка “Update” - обновляет список ошибок (полезно после исправления)
  3. “Redecode this” и “Redecode next” и - вызывают окно “Redecode MCU #” для активного и следующего MCU
  4. 5 опций “Redecode from:” позволяют задать смещение, которое будет передано в диалог “Redecode MCU #” при этом
  5. Кнопка ‘Redecode with shift…” вызывает перезапуск декодирования изображения со смещением. Смещение задаётся полем ввода рядом.
  1. При положительном смещении указанное количество MCU блоков удаляется (всё изображение после текущего MCU сдвигается влево), удаление происходит при каждом нажатии на кнопку
  2. При отрицательном смещении вставляется указанное количество MCU блоков (всё изображение после текущего MCU сдвигается вправо), повторные нажатие не приводят к вставлению ещё такого же количества блоков
  1. Полоса прокрутки рядом с полем ввода позволяет задавать смещение без ввода
  1. Клики на кнопки < и > изменяют смещение на 1
  2. Клики на полосу рядом с ползунком - на 3
  3. Перетаскивание ползунка - от 1 до 10
  1. Флаг “Clean missing MCUs” задаёт, будут ли вставляемые блоки очищаться (в серый цвет) или нет
  2. Кнопка “Cancel redecode” позволяет отменить изменения декодирования текущего MCU
  3. Кнопки “Mrk1->Mrk2” и “Mrk2->Mrk1” задают смещение на основании расстояния между маркерами 1 и 2, установленными на изображении
  4. Кнопка “Mrk1-2 to EOL” выставляет смещение, чтобы маркер 2 оказался в конце строки MCU блоков, а маркер 1 - максимально близко к текущему MCU (либо в одной строке с ним, либо в следующей строке). Таким образом, если маркер 1 стоит на начале хорошего изображения после сбоя, а маркер 2 - непосредственно перед швом “лево/право” - то “Mrk1-2 to EOL” исправит сдвиг изображения на нужный. См. также п. 4.2 и 4.3
  5. Флаг “Auto(1) redecode” задаёт, будет ли выполняться автоматически “Redecode with shift…” при нажатии на “Mrk1->Mrk2”, “Mrk2->Mrk1” и “Mrk1-2 to EOL”
  6. Кнопки “Set DiffRange” задают полосу для связывания цвета в соответствии с полями ввода около них. Первый блок задёт полосу для связывания “до сбоя” (текущей строки с нижней), второй блок - для связывания “после сбоя” (предыдущей строки с текущей). Кнопки “<<” и “>>” изменяют поля ввода на 1.
  7. Рекомендуется задавать полосу вручную.
  8. Кнопка “Auto color” выполняет автоматическую корректировку цвета на основании полосы для связывания.
  9. Кнопка “Change DC base” вызывает окно “DC fix”
  10. Кнопка “Auto(2) auto color” задёт будет ли выполняться автоматически “Auto color” при нажатии на “Set DiffRange” а также на “Mrk1->Mrk2”, “Mrk2->Mrk1” и “Mrk1-2 to EOL”
  11. Кнопка “Copy from Left” заменяет картинку в текущем MCU блоке на картинку из предыдущего, на декодирование это не влияет
  12. Кнопка “Redecode rest” вызывает декодирование всего изображения после текущего MCU (с “перезапуском”)
  13. Кнопка “Redecode X more Lines” вызывает декодирование ещё нескольких строк MCU блоков, количество задаётся полем ввода рядом. Кнопки “<<” и “>>” изменяют поле ввода на 1.
  14. Кнопка “Redecode more Line” вызывает декодирование ещё одной строки MCU блоков
  15. Кнопка “Redecode rest after” вызывает декодирование всего остального изображения (без “перезапуска”)
  16. Кнопка “Redraw before” вызывает перерисовку всего изображения до сбойного блока (полезно в основном при работе по списку ошибок, если изображение не было отрисовано или перерисовано после изменений)
  17. Кнопка “Remove error” - удаляет текущую ошибку из списка (только при работе по списку ошибок)

5.4. Управление с клавиатуры

(текст в процессе подготовки)

6. Пример ремонта файла

Рассматривается ремонт файла с уцелевшим заголовком и с небольшими искажениями в теле основного изображения.

  1. Скачайте файл IMG_1280_br.JPG
  1. Ссылка: http://ge.tt/9uNWnZ6?c
  1. Зеркало файла: http://goo.gl/DHtnhv
  1. Это реальный снимок, который я сделал в 2004 году, но в него внесены 3 искажения - сбойный байт, замена нескольких байт на "левые" и вырезание небольшого блока. Первое же из искажений приводит к виду "серый низ" в обычных просмотрщиках.
  1. Загрузите файл в JPEGfix
  1. Main -> Load JPEG
  1. Увеличьте файл до 100%
  1. Redraw -> Draw 1:1 color
  2. (или 3 раза "+" на клавиатуре)
  3. Вы увидите снимок целиком, но и искажениями цвета и сдвигами.
  1. Включите показ MCU-блоков
  1. Analyze -> Show MCU
  2. Появится окно "MCU". Переместите его, чтобы заголовок был виден даже когда окно JPEGfix активно. В заголовке отображается порядковый номер MCU-блока, его координаты, смещение от начала файла и длина в битах.
  1. Например MCU #1581 (45,24) began at 0x0001734F:1, len: 219 bits
  2. 1581 - порядковый номер MCU от верхнего левого угла
  3. (45,24) - координаты X и Y, также от верхнего левого угла
  4. 0x0001734F - смещение от начала файла в байтах
  5. :1 - дополнительное смещение в битах
  6. 219 bits - длина блока в битах
  1. Найдите первый сбойный блок - он содержит "помехи", с него начинается сдвиг и/или искажение цвета.
  1. В данном случае #1581 (45,24) или #1582 (46,24).
  2.  - синий квадрат выделяет блок #1581
  1. Найдите первый неповреждённый блок сразу после сбоя. Это блок выглядит единым целым с последующим изображением (влево и вниз от блока), и не содержит "помех".
  1. В данном случае этот блок #1584 (48,24)
  1. Поставьте на этот блок маркер "1" (Mrk1)
  1. Удерживая нажатой цифру 1, кликните мышкой по нужному блоку.
  2. Вокруг блока должен появиться оранжевый овал
  3.  - оранжевый овал на блоке #1584
  1. Найдите где идёт левая/правая граница снимка сразу после сбоя.
  1. В данном случае изображение сдвинуто вправо на 1 блок, а границу, соответственно, видно между 1 и 2-м блоком каждой строки (см. слева снимка, между блоками #1600 и #1601 и шов, идущий вниз)
  1. Поставьте в этом месте на блок до границы - маркер "2" (Mrk2)
  1. Удерживая нажатой цифру 2, кликните мышкой по нужному блоку.
  2. В данном случае нужный блок - #1600 (0,25).
  3. Вокруг блока должен появиться фиолетовый овал
  4.  - фиолетовый овал на блоке #1600 и вертикальный шов
  1. Кликните правой кнопкой мышки на первом сбойном блоке. Откроется контекстное меню.
  1. Напоминаю, блок #1581 (или #1582)
  1. Выберите "Repair this MCU"
  1. Откроется окно "Errors"
  1. Нажмите кнопку "Mrk1-2 to EOL"
  1. Сдвиг одной строки будет устранён, но это будет плохо заметно.
  1. Нажмите кнопку "Redecode X more lines".
  1. Теперь станет лучше видно, что сдвиг устранён - отрисуется ещё 10 строк блоков.
  1. Найдите на границе между областями до сбоя и после сбоя (где виден перепад цвета зелёное->светло зелёное) полосу, где изображение сверху и снизу содержит либо равномерный фон, либо вертикальные линии.
  1. Например, можно взять линию от блока #1567 до #1571.
  1. Отметьте эту линию как область корректировки цвета.
  1. Удерживая нажатой цифру 3, кликните левой кнопкой мышкой по первому блоку и не отпуская цифры 3 и кнопки мышки проведите до последнего блока.
  2. Линия блоков будет выделена (синяя рамка), но ещё будет дополнительно обведена серой рамкой.
  3. - блоки #1567-#1571 выделены синим и серыми рамками
  1. Нажмите на форме "Errors" кнопку "Auto color"
  1. Одна строка блоков после сбоя станет правильного цвета.
  2.  - строка 25 стала правильного цвета
  1. Нажмите кнопку "Redecode X more lines".
  1. Ещё 10 строк станут нормального цвета и вы лучше увидите второй сбой и искажение цвета после него
  2.  - автомат исправил сдвиг и искажение цвета
  1. Первый сбой ликвидирован
  2. Опционально можно замазать оставшиеся искажённые блоки.
  1. Выделите блоки #1581 и #1582 проведя по ним мышкой
  2. Кликните правой кнопкой мышки на одном из них. Откроется контекстное меню.
  3. Выберите пункт “Clean MCU”
  4. Оба блока будут залиты серым.
  5.  - блоки #1581 и #1582 залиты серым
  1. Второй сбой не содержит сдвига, нам нужно только исправить цвет. Для этого кликайте правой кнопкой мышки по сбойному блоку
  1. Это блок #2250 (10,35)
  1. Выберите "Repair this MCU"
  1. Снова откроется окно "Errors"
  1. Снова найдите на границе между областями до сбоя и после сбоя (где виден перепад цвета) полосу, где изображение сверху и снизу содержит либо равномерный фон, либо вертикальные линии.
  1. Например, можно взять линию от блока #2195 до #2198
  1. Отметьте эту линию как область корректировки цвета.
  1. Удерживая нажатой цифру 3, кликните левой кнопкой мышкой по первому блоку и не отпуская цифры 3 и кнопки мышки проведите до последнего блока.
  2. Линия блоков будет выделена (синяя рамка), но ещё будет обведена серой рамкой.
  1. Нажмите на форме "Errors" кнопку "Auto color"
  1. Одна строка блоков после сбоя станет правильного цвета.
  1. Нажмите кнопку "Redecode X more lines" два раза.
  1. Ещё 20 строк станут нормального цвета и вы лучше увидите третий сбой и небольшое искажение цвета после него
  2.  - после исправления, синяя рамка выделяет блок #2250, серая рамка блоки #2195-#2198.
  1. Второй сбой ликвидирован.
  2. Опционально можно замазать оставшийся искажённый блок #2250.
  1. Аналогично как выше - выделить и “Clean MCU”.
  1. Третий сбой содержит большой сдвиг.
  2. Найдите где идёт левая/правая граница снимка сразу после сбоя.
  1. В данном случае изображение сдвинуто влево на 5 блоков, а границу, соответственно, видно справа снимка между блоками #3257 и #3258 и вниз.
  1. Поставьте в этом месте на блок до границы - маркер "2" (Mrk2)
  1. Удерживая нажатой цифру 2, кликните мышкой по нужному блоку.
  2. В данном случае нужный блок - #3257 (57,50).
  3. Вокруг блока должен появиться фиолетовый овал
  1. Найдите сбойный блок - он содержит "помехи" изображения, с него начинается сдвиг и/или искажение цвета.
  1. В данном случае это блок #3241
  1. Следующий блок уже не сбойный, ставьте на него маркер "1" (Mrk1)
  1. Удерживая нажатой цифру 1, кликните мышкой по нужному блоку.
  2. Вокруг блока должен появиться оранжевый овал
  3. - оранжевый овал вокрут блока #3242 и фиолетовый вокруг блока ##3257
  1. Кликните правой кнопкой мышки на сбойном блоке. Откроется контекстное меню. Выберите "Repair this MCU"
  1. Снова откроется окно "Errors"
  1. Нажмите кнопку "Mrk1-2 to EOL"
  1. Сдвиг одной строки будет устранён.
  1. Снова найдите на границе между областями до сбоя и после сбоя (где виден перепад цвета) полосу, где изображение сверху и снизу содержит либо равномерный фон, либо вертикальные линии.
  1. Например, можно взять линию от блока #3234 до #3238
  1. Отметьте эту линию как область корректировки цвета (см. выше).
  2. Нажмите на форме "Errors" кнопку "Auto color"
  1. Одна строка блоков после сбоя станет правильного цвета.
  1. Нажмите на форме "Errors" кнопку "Redecode rest after”
  1. Всё изображение до конца будет исправлено.
  1. Но осталась серая полоса, которая сильно бросается в глаза. Её также можно замазать стиранием (“Clean MCU”), но есть способ лучше. Выделите линию блоков сразу над серой такой же длины.
  1. Блоки с #3177 по #3184
  2.  - выделена линия блоков над утраченной полосой
  1. Вызовите контекстное меню и нажмите пункт “Copy MCUs #3177-3184 (8, 8x1)”
  1. Это копирование блоков аналогично как в буфер обмена (но в сам буфер обмена ничего не будет скопировано).
  1. Кликните правой кнопкой мыши по первому серому блоку
  1. Блок #3241
  1. Выберите пункт “Replace strip (8 MCUs)”
  1. Вместо серой полосы будет копия выделенной полосы сверху.
  1. Готово, можно сохранять.
  1. Main -> Save JPEG
  1. Для сравнения можно скачать исходный снимок IMG_1280_src.JPG, результат моего ремонта IMG_1280_br_fixed.JPG и сравнить результаты между собой и с вашим.
  1. Ссылка: http://ge.tt/9kGbnZ6?c
  1. Зеркало файлов: http://goo.gl/g6C3KW ;  http://goo.gl/P3aYd3

7. Более сложный ремонт

7.1. Быстрый ремонт без годного заголовка

Быстро починить файл, если у него пострадал заголовок, но есть похожий файл и плевать на сдвиг.

  1. Загрузите заголовок от хорошего файла
  1. Main->Advanced Load JPEG
  2. Выбираете хороший файл
  3. Load only markers
  4. OK
  1. Загрузите пострадавший файл как скан
  1. Main->Advanced Load JPEG
  2. Выбираете повреждённый файл
  3. Load scan data
  4. Откроется фото в неправильном цвете
  1. Увеличьте фото до 100%
  1. Draw->Redraw 1:1 color (slowest)
  2. Фото станет на весь экран
  1. Найдите место где начинается фотография а до неё идёт мусор
  1. Можно сдвигать фото стрелками на клавиатуре
  1. Выделяете область фото, искажённую одинаково
  1. Нажимаете мышкой на верхний край фото - по той области где ещё явно фотография
  1. Чем выше и чем левее - тем лучше, но не залезьте в мусор в самом начале
  1. Не отпуская кнопку мышки ведёте вниз и при этом стрелками на клавиатуре двигаете фото вниз - до тех пор пока не дойдёте до низа изображения или пока цвет фотографии не изменится сильно на другой (вместо зелёного - оранжевый и т.п.)
  2. Отпускаете мышку
  3. Вертикальный прямоугольник будет выделен синей рамкой (не важно насколько он узкий)
  1. Нормализуете выделенное
  1. Правой кнопкой мышки и пункт "Change DC base..."
  2. Откроется форма "DC fix"
  3. Жмите "Normalize as a whole"
  4. Вся фото от верхнего края выделенного до нижнего станет более-менее нормального цвета
  1. Если у вас нужная часть фото внизу всё ещё неправильного цвета - декодируем оставшуюся часть изображения с тем же цветом
  1. Тыкаете правой кнопкой в любое место, которое только что окрасилось правильно
  2. В выпавшем меню выбирайте "Redecode MCU..."
  3. Откроется ещё одна форма
  4. В ней нажмите "Redecode All"
  5. Остальная часть фото окрасится в правильный цвет
  1. Включаем restructure
  1. Жмём Override->Restructure JPEG on save - если нет флажка
  1. Сохраняем
  1. Save JPEG
  1. Для следующей фото начинаем с п.1, если что-то не сработало - перезапускаем JPEGfix

8. Устройство файлов JPEG

Данные раздел будет пополнен, пока же рекомендую обратится к 2-м ссылкам:

  1. Статья “Декодирование JPEG для чайников” на Хабрахабре
  1. http://habrahabr.ru/blogs/algorithm/102521/
  1. FAQ по восстановлению повреждённых изображений на форуме iXBT
  1. http://forum.ixbt.com/post.cgi?id=annc:23:28361
8.1. Последовательность маркеров

Типичная структура корректного JPEG-файла с фотографией:

  1. SOI
  2. APP1
  3. DQT (до 2-х)
  4. SOF0
  5. DHT (до 4-х)
  6. SOS
  7. Image (scan)
  8. EOI

Допустимая по стандарту структура:

  1. SOI
  2. Один или несколько сканов (1 для обычного изображения, несколько - для прогрессивного):
  1. Tables/misc - в любом порядке:
  1. SOFn (1 обязателен, больше одного - запрещено)
  1. Обычно SOF0 (обычное изображение) или SOF2 (прогрессивное)
  1. DQT (1 обязателен)
  2. DHT (1 обязателен)
  3. DRI
  4. APPn (APP0-APP15)
  5. JPGn (JPG0-JPG15)
  6. Прочее
  1. SOS
  2. Image (scan)
  1. Может содержать RST0-RST7 маркеры, повторяющиеся циклом
  1. EOI
8.2. Представление информации

При редактировании JPEG можно редактирвоать данные в разных представлениях. Важно понимать какие есть представления и как они связаны друг с другом

  1. Байты
  1. Файлы на дисках и т.д. хранится в виде байтов. Байт состоит из 8 бит.
  2. Если вы редактируете файл в hex-редакторе вы имеет дело с шестнадцатеричным представлением байт. Каждый байт представляется двумя шестнадцатеричными “цифрами” - цифрами 0-9 или буквами A-F. Например байты: 00, 1A, F6, CE и т.д.
  1. Кодирование Хаффмана
  1. Изображение JPEG является сжатым, основным вариантом сжатия является кодирование Хаффмана. Оно использует битовые последовательности, т.е. коды Хаффмана не находятся в отдельных байтах, а могут быть лишь частью байта, а также пересекать границы байт в файле.
  1. DCT-коэффициенты
  1. Кодированием Хаффмана в JPEG-е записаны DCT-коэффициенты. Это коэффициенты дискретного косинусного преобразования.
  2. В JPEG используются матрицы 8х8 - 64 DCT-коэффициента соответствуют 64 пикселям растра.
  3. Один из DCT-коэффициентов - особенный. Это (0,0) коэффициент, который отвечает за постоянную составляющую. Если все остальные коэффициенты равны нулю, то этот определяет цвет всех 64 пикселей растра в матрице 8х8. (0,0) коэффициент также называют DC (от “direct current”) и он хранится отдельным образом - записывается только его изменение от блока к блоку. Именно он отвечает за искажение цвета при сбоях - т.к. если искажается несколько блоков, то DC-коэффициент становится неправильным для всего последующего изображения. Также для DC-коэффициентов обычно используется отдельная таблица Хаффмана.
  4. Остальные коэффициенты называются AC и значения всех 63 хранятся полностью в своём блоке.
  1. MCU-блоки
  1. MCU-блок - отдельный “кирпичик” JPEG-изображения. Он состоит из нескольких матриц DCT-коэффициентов 8х8 (DU - dataunit), кодирующих разные цветовые каналы.
  2. Очень часто применяется уменьшение разрешения некоторых цветовых каналов (sampling). В этом случае MCU-блок содержит разное количество DU для разных цветовых каналов.
  3. Наиболее типичное уменьшение разрешения - растягивание Cb и Cr цветовых каналов по горизонтали, применяемое почти всеми цифровыми фотоаппаратами. При этом один MCU-блоки состоит из 4 DU - двух для Y-канала и по одному для Cb и Cr. В пикселях такой MCU имеет размер 16х8. DU для Y-канала задают непосредственно Y-канал матрицами 8х8 пикселей. А пиксели DU для Cb и Cr - задают каждый по 2 пикселя каналов.
  4. По неустановленным причинам, в случае сбоев в файле, декодирование MCU-блоков из байтов восстанавливает битовую синхронизацию - т.е. после несколько “плохих” MCU-блоков после сбоя, следующие MCU-блоки начинают декодироваться с правильных смещений. Именно это позволяет восстанавливать изображения из области после сбоя.
  1. YCbCr-представление
  1. Y, Cb и Cr - цветовые каналы. Y - яркостный канал, Cb и Cr - цветоразностные. Изображение, использующее только Y-канал является чёрно-белым. Cb задаёт смещение в синий цвет (или в жёлтый при Cb<0), Cr - в красный (или в голубой если Cr<0). Y=0 означает 50% серый.
  2. Y канал кодируется в JPEG обычно при использовании отдельных таблиц квантования и Хаффмана. Это связано с тем, что человеческий глаз более чувствителен к искажению яркости, чем цвета.
  3. YCbCr напрямую преобразуется в RGB и обратно
  1. RGB
  1. RGB - типичное представление изображения на экранах компьютеров. R - красный, G - зелёный, B - синий. Значения яркости для всех трёх каналов - от 0 до 255.

Работа в JPEGfix идёт в основном с MCU-блоками. Вы либо задаёте откуда из файла начинать читать MCU-блок (в названиях действий - слово “redecode”, смещение задаётся в битах), либо заменяете содержимое MCU-блока - заливаете серым или копируете из другого MCU-блока.

На экране вы при этом видите растр в RGB, а в файл сохраняете байты.

Окно, вызываемое через “Show MCU info”, позволяет посмотреть на DCT-коэффициенты и DU-структуру MCU-блока.

9. Что делать, чтобы не потерять ценные данные?

Главное, что нужно запомнить: Информация - не материальна. Потерять файлы гораздо проще, чем их восстановить.

  1. Копирование, копирование и ещё раз копирование. Для ценных фотоснимков рекомендую делать 3 копии на разных типах носителей: HDD компа/ноута, внешний USB-диск и DVD-диски. Делитесь снимками с друзьями, выкладывайте их в интернет. Например, яндекс-фотки - резиновые, ограничения по объёму нет, залейте туда всё в закрытые альбомы, например.
  2. Проверка и ещё раз проверка. Перед удалением файлов или форматирование носителя убедитесь, что цела хотя бы ещё одна копия этих файлов. Особенно, если остаётся только одна копия. Особенно, когда используете непроверенное оборудование - в походе/отпуске/командировке. Особенно, если используете нестандартные программы для копирования. Просмотрите несколько файлов в начале, несколько - в конце и несколько - в средине - что все они скопировались, полностью и отображаются.
  3. Перед использованием картридера убедитесь, что он поддерживает вашу флешку и её размер. Например, если картридер не знает про SDHC (4ГБ и больше), совать в него SDHC карту просто опасно, даже на чтение.
  4. Если что-то случилось с носителем информации - не записывайте на него ничего, не удаляйте ничего, не форматируйте, не загружайтесь с него, не используйте с непроверенным оборудованием и т.д. - любая модификация уменьшает шансы спасти ценные файлы в непредсказуемое число раз. Пока вы не убедились, что спасли всё (или что больше ничего спасти невозможно) - только читайте диск, причём чем меньше раз - тем лучше. Лучшая тактика - снять полный образ и спрятать носитель "в сейф", а данные извлекать из образа.
  5. Проверяйте SMART ваших HDD-дисков, в т.ч. внешних USB-дисков.
  1. Индикатор Reallocated_Sector отличный от нуля - повод для немедленного копирования всех данных и скорейшей замены диска.
  2. Высокая температура диска - повод добавить охлаждения.
  1. После записи CD/DVD/BD и т.п. убедитесь, что все файлы записались успешно. Если каталогов на диске нет, достаточно проверить несколько первых, последних файлов и в средине. Если есть каталоги - то проверять нужно в корне, в первом и последнем каталоге. Проверка фотографий - их просмотр в полном размере.
  1. Задача - проверить начало, средину и конец диска (бывают случаи, когда информация не дозаписывается - с некоторого момента начинают нарезаться нули), однако порядок записи файлов может варьироваться от программы к программе, обычно поддерживается прямой или обратный порядок по алфавиту.
  1. Если флешка при работе нагрелась - файлы могли скопироваться с ошибками.
  2. Перед использованием диска больше 137 ГБ (128 GiB) на новом компе / операционной системе, убедитесь, что комп (железо и BIOS) и ОС поддерживают такие диски и режим поддержки включен.
  3. Флешку для фотоаппарата - форматируйте только в нём. Воздержитесь от копирования файлов на такую флешку через картридер. Не используйте одну и ту же флешку в разных фотоаппаратах без промежуточного форматирования.
  4. Лучше отформатировать флешку, чем стереть с неё все файлы - если форматировать то следующие снимки будут ложиться на флешку без фрагментирования. Кроме того, форматирование обычно быстрее.
  5. Не стирайте файлы, если ещё хватает свободного места. Если в походе/отпуске следующий "цикл" съёмки скорее всего не заполнит флешку до конца, лучше не стирайте с флешки все файлы, хоть и скопированные на другие носители, - сотрите половину (например, менее ценные, видео, RAW при наличии JPG). Фрагментирование новых снимков - меньшее зло, чем полная потеря старых снимков из-за сбоя другой копии.
  1. Пример: съёмка в течение недели обычно забивает 1 ГБ. Флешка 4 ГБ, изначально отформатирована. Отпуск 2 недели. Вывод - не стоит удалять файлы с неё, скорее всего вы её не забьёте.
  2. Пример: съёмка в течение недели обычно забивает 2 ГБ. Флешка 4 ГБ, изначально отформатирована. Отпуск 4 недели. Вывод - флешка скорее всего забьётся, желательно раз в неделю делать копии файлов на другой носитель и удалять с флешки после проверки того носителя.
  1. Не используйте встроенные программы Windows для просмотра фотографий - Picture and Fax Viewer, Windows Photo Viewer и т.п. Если выбора нет не поворачивайте фотографии в этих программах. При повороте эти программы перезаписывают изображения, что может приводить к их искажению и потере.
  2. При сохранении ценных изображений в JPEG не рекомендуется использовать прогрессивное кодирование (progressive encoding) и адаптивные/оптимизированные (optimize/adaptive) таблицы Хаффмана, т.к. это уменьшает шансы восстановить изображение в случае его повреждения, но при этом несущественно уменьшает размер файла. В случае прогрессивного кодирования восстановить удаётся только всё что находится в файле до повреждения. В случае адаптивных таблиц Хаффмана изображение не подлежит восстановлению в случае утраты только таблиц. В том числе, адаптивные таблицы Хаффмана использует инструмент Guetzli.
  3. Рекомендуется ознакомиться с инструкциями на фотоаппараты и прочее используемое оборудование. Например, фотоаппараты сохраняют изображения на носители не мгновенно, о чём обычно сигнализируют индикаторами. В это время не рекомендуется выключать их, а также нельзя выдёргивать аккумулятор или носитель информации.

P.S. Хорошей проверкой корректности записи на CD/DVD/BD является вычисление контрольных сумм или хэшей всех файлов и сличение их (хэшей) с оригинальными файлами. Однако при этом нужно быть уверенными в оригинальных файлах, т.к. сравнение хэшей не выявит ошибки если вы запишете не те файлы, которые хотели.

Для вычисления хэшей можно использовать, например, утилиту ShaFile: http://overquantum.livejournal.com/1354.html