Как определить разницу между исходным файлом изображений .BMP / .EMF и обработанным файлом .BMP / .EMF? - PullRequest
2 голосов
/ 05 декабря 2010

Суммирование:

  1. Вычисления прямо указывают на то, что: .BMP-изображение 3289 X 4570 X 32bpp занимает около 53 МБ. Изображение того же размера, но 24bpp занимает около 43 МБ, а 16bpp - около 28 МБ. Файл изображения, обработанный ChemDraw, должен быть преобразован из 24bpp в 16bpp в моей ситуации.

  2. Дальнейшее сравнение шестнадцатеричных данных обоих файлов дает более детальное понимание разницы между обработанной ChemDraw картинкой и исходной картинкой. В частности, ChemDraw хранит «EMF_STRETCHDIBITS» вместо «EMF_STRETCHBLT». Следует добавить, что «EMF_STRETCHDIBITS» можно сделать, вызвав StretchDIBits при копировании пикселей в TMetaFile / TMetaFileCanvas. Следует также отметить, что пиксели для «EMF_STRETCHDIBITS» должны быть такими же, как и для «EMF_STRETCHBLT».

  3. К сожалению, до сих пор я не узнал, как ChemDraw точно обрабатывает и хранит вставленные изображения. То есть я не выяснил, почему пиксели, сохраненные в ChemDraw, отличаются от тех, которые я могу получить программным способом.

    PS: Я буду голосовать добрыми ответами по этому вопросу позже, потому что у меня пока недостаточно репутации. Спасибо всем, кто был любезен комментировать!

===

Привет

Большое спасибо за ваше время!

Скажите, что у меня есть картинка с именем "sample_original.bmp". Размер файла составляет 3289 х 4570, 43 МБ. Затем я делаю следующее, чтобы преобразовать его в файл .EMF (расширенный метафайл Windows):

Метод 1, сделав небольшую внутреннюю программу Delphi: (1) Загрузите файл изображения .BMP. (2) Получить холст TMetaFile (TMetaFileCanvas) (3) Вызовите Canvas.Draw, чтобы скопировать изображение. (4) Сохранить в файл .EMF с именем "sample_original_bmp2emf_method1.emf"

Метод 2: (1) Откройте файл изображения .BMP в программе mspaint, выберите «выбрать все» и выберите «копировать». (2) Откройте внешнюю программу под названием ChemDraw, создайте новый документ и выберите «вставить». (3) Затем я решил сохранить его в XML-совместимом формате .cdxml с именем «sample_original_bmp2emf_method2.cdxml». (4) Содержимое изображения (может быть изменено или ухудшено?) Теперь сохраняется в файле sample_original_bmp2emf_method2.cdxml. Формат - это сжатый zlib формат Base64. (5) Я могу Base64-декодировать строку XML, распаковать zlib и сохранить ее в файле рисунка "sample_original_bmp2emf_method2.emf".

Размер файла sample_original_bmp2emf_method2.emf на 15 МБ меньше, чем sample_original_bmp2emf_method1.emf, но ширина и высота были сохранены. Кроме того, если я открою «sample_original_bmp2emf_method2.emf» в программе mspaint и сохраню его обратно в формате файла .bmp, появится предупреждение о том, что прозрачная информация теряется.

Не могли бы вы прокомментировать, как определить разницу "sample_original_bmp2emf_method1.emf" & "sample_original_bmp2emf_method2.emf"? Изображение меньше, потому что его качество снижается? Другими словами, какие изменения в моей исходной картинке могут быть сделаны этой внешней программой?

С наилучшими пожеланиями,

Файлы, упомянутые выше, можно загрузить по следующему адресу:

http://www.rapidspread.com/file.jsp?id=2ighvzoci8

PS: Я полагаю, что Андреас Рейбранд был достаточно любезен, чтобы сделать свой ответ, и я затем дал свои комментарии. Но я не вижу их сейчас. Это должно быть нормальное поведение системы? О_О

Ответы [ 2 ]

1 голос
/ 05 декабря 2010

Почему бы вам просто не сравнить два изображения? Откройте их в программе редактирования растра и сравните пиксели.

Почему тебя волнует размер файлов? Конечно, важно то, является ли изображение правильным.

1 голос
/ 05 декабря 2010

Вы писали:

Base64-декодирует строку XML, распаковывает zlib и сохраняет ее в файле рисунка "sample_original_bmp2emf_method2.emf".

Так что это определенно НЕ файл с расширением emf, а какой-то сжатый формат .. Или он был преобразован в другой формат (например, векторный) перед преобразованием в XML. В этом случае у вас будет меньше данных в результирующем изображении, чем в реальном растре.

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

Если вы заархивируете файл эдс первого метода, я вполне уверен, что вы получите файл с меньшим размером, чем ложный эдс, полученный методом два.

...