Как отличить исходный файл изображения .BMP/.EMF от обработанного файла .BMP/.EMF?

Резюме:

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

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

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

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

===

Hi,

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

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

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

Способ 2: (1) Откройте файл изображения .BMP в программе mspaint, выберите «Выбрать все» и выберите «Копировать». (2) Откройте внешнюю программу под названием ChemDraw, создайте новый документ и выберите «Вставить». (3) Затем я решил сохранить это в формате .cdxml, совместимом с XML, с именем sample_original_bmp2emf_method2.cdxml. (4) Содержимое изображения (возможно, измененное или ухудшенное?) теперь сохраняется в файле sample_original_bmp2emf_method2.cdxml. Формат представляет собой сжатый формат zlib в кодировке Base64. (5) Я могу декодировать строку XML с помощью Base64, распаковать ее с помощью 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: Я считаю, что Андреас Рейбранд был достаточно любезен, чтобы дать свой ответ, а затем я дал свои комментарии. Но я не могу видеть их сейчас. Это должно быть нормальным поведением системы? о_о


person SOUser    schedule 05.12.2010    source источник
comment
Что бы вы не открыли в Powerpoint и сохранили изображение как форму .emf и посмотрите, какой размер вы получите. Сложная схема в методе 2, кажется, добавляет много ненужных шагов в процесс. Кроме того, детали реализации ChemDraw, вероятно, являются источником любых различий.   -  person John Alexiou    schedule 05.12.2010
comment
Большое спасибо за ваши комментарии! Как вы сказали, ChemDraw является источником различий. Меня беспокоит, есть ли способ понять различия? Я имею в виду, ухудшилось ли изображение, почему изображение имеет меньший размер при сохранении его ширины и высоты и так далее.   -  person SOUser    schedule 05.12.2010
comment
EMF — это векторный формат изображения. BMP — это растровый формат. Почему вы хотите конвертировать BMP в EMF, это кажется странным.   -  person David Heffernan    schedule 05.12.2010
comment
@David: Спасибо за ваше время! Я понимаю, что EMF - это векторный формат изображения. Причина в том, что мне нужно поместить свои картинки в программу ChemDraw (для создания новых, может быть, более сложных картинок для научной публикации), а ChemDraw сохраняет в формате EMF. Однако, как было сказано выше, я случайно обнаружил, что картинка ЭМП, которую хранит ChemDraw, отличается от той, которую я могу получить из оригинального BMP. Я очень обеспокоен тем, что именно произошло с исходным изображением. :D   -  person SOUser    schedule 05.12.2010
comment
@David Heffernan: на самом деле рисование растрового изображения на холсте метафайла встраивает растровый объект в контейнер   -  person Free Consulting    schedule 05.12.2010
comment
@user205376 user205376 На самом деле я этого не знал, хотя теперь, когда я думаю об этом, я вижу, что другого выхода нет.   -  person David Heffernan    schedule 05.12.2010


Ответы (2)


Вы написали:

Base64-декодируйте строку XML, zlib-распакуйте ее и сохраните в файл изображения «sample_original_bmp2emf_method2.emf».

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

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

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

person Arnaud Bouchez    schedule 05.12.2010
comment
@Arnaud: Спасибо за уделенное время! Я могу не прояснить ситуацию. Как я уже писал, ChemDraw хранит картинку в формате zlib, сжатом в кодировке Base64. Если я декодирую его с помощью base64, zlib-декомпрессирует декодированные шестнадцатеричные данные, распакованные шестнадцатеричные данные действительно ЯВЛЯЮТСЯ ИСТИННЫМ файлом .emf. Байты заголовка являются одним из доказательств. Я также могу сохранить распакованные шестнадцатеричные данные в файл .emf и открыть его в программе mspaint. Если вы заархивируете emf-файл первого метода, я совершенно уверен, что вы получите файл меньшего размера ... это верная вещь. Что меня беспокоит, так это то, что если мы сравним обе несжатые версии, два файла emf будут отличаться. - person SOUser; 05.12.2010
comment
@Xichen: поэтому я предполагаю, что два файла emf содержат разные данные. Возможно, разрешение или биты цвета не совпадают. Используйте frazmetic.free.fr/emfexplorer, чтобы увидеть, в чем разница между двумя файлами emf. - person Arnaud Bouchez; 06.12.2010
comment
@Arnaud: Спасибо за ваши комментарии! Как вы сказали, файл изображения .EMF, обработанный ChemDraw, вероятно, теряет определенные данные. Однако ширина и высота сохранены. 24 бита цвета также сохраняются. Таким образом, я не знаю, что еще можно было сделать в ChemDraw. Благодарим за ваше предложение! Я скачал emfexplorer и использовал его для открытия файлов .EMF. Однако цель emfexplorer, по-видимому, состоит в том, чтобы отображать векторные команды внутри одного файла .EMF с разными деталями. Это не помогает понять разницу файлов .EMF в моей ситуации, не так ли? - person SOUser; 06.12.2010
comment
@Арно: ты прав. Цветовые биты в файлах изображений .EMF, обработанных ChemDraw, кажутся 16-битными. Большое спасибо за ваши комментарии! (В настоящее время я не могу проголосовать за ваш или другие ответы, потому что у меня недостаточно репутации. Я попробую позже.) - person SOUser; 08.12.2010

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

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

person David Heffernan    schedule 05.12.2010
comment
@David: Спасибо за ваши комментарии!! Не могли бы вы порекомендовать определенные программы для редактирования растровых изображений? Если я смогу увидеть разницу между пикселями, возможно, я увижу, какие изменения внес ChemDraw в мое исходное изображение. Что касается вашего второго комментария, меня больше всего беспокоит, ухудшилось ли изображение. Если я смогу узнать о том, какие изменения произведет ChemDraw, прежде чем сохранить изображение, которое я в него вставлю, это будет лучше всего, потому что тогда я также могу узнать о реализации ChemDraw. - person SOUser; 05.12.2010
comment
@Xichen Li Я использую Paint.NET, но на самом деле подойдет что угодно. Я хочу сказать, что вы обеспокоены тем, что ChemDraw изменит и ухудшит ваше изображение. Так почему вас волнует, какой это размер? Конечно, важно то, изменяет ли это или ухудшает ваш имидж! - person David Heffernan; 05.12.2010
comment
@David: Спасибо за ваши комментарии! Я посмотрю руководство по Paint. Net и дайте вам знать, если есть какие-либо новости. Причина в том, что разница в размере файла может указывать на то, что ChemDraw изменяет/деградирует вставленное изображение? Кроме того, если я могу знать, что именно происходит с вставленными изображениями, я могу перестать беспокоиться (если изменения/ухудшения незначительны) или предотвратить такие изменения (если они достаточно заметны). - person SOUser; 05.12.2010
comment
@David: извините, но не могли бы вы конкретно рассказать о том, как использовать Paint .NET, чтобы понять сравнение пикселей двух файлов изображений .EMF? В мануале соответствующей инструкции не нашел. :D - person SOUser; 06.12.2010
comment
@Xichen Li загрузите два изображения, немного увеличьте масштаб, посмотрите на них рядом, посмотрите, сможете ли вы найти какие-либо различия. Еще раз задаю вопрос, а какое вам дело до размера файлов? Видите ли вы какие-либо различия в изображениях? - person David Heffernan; 06.12.2010
comment
@David: Спасибо за ваши комментарии! Я не могу заметить никаких различий между двумя файлами изображений .EMF невооруженным глазом. Однако то, что я не вижу различий, не гарантирует, что качество исходной картинки не изменится, или я ошибаюсь? В файле изображения, обработанном ChemDraw, меньше на 15 МБ. Тогда я бы подумал, что должно быть что-то потеряно, и был бы очень счастлив, если бы узнал, что случилось с моим файлом с изображением. - person SOUser; 06.12.2010
comment
@Xichen: Если никто не видит разницы, то почему ты беспокоишься? Я сказал это 3 или 4 раза, и теперь я сдаюсь! - person David Heffernan; 06.12.2010
comment
@David: Спасибо за ваше время и усилия, чтобы помочь мне! Как я уже упоминал, в файле изображения, обработанном ChemDraw, должно быть что-то потеряно/изменено. И неуверенность, и любопытство заставляют меня хотеть узнать, что именно могло произойти. Еще раз спасибо за ваше время! - person SOUser; 06.12.2010