Резюме:
Расчеты прямо указывают на то, что: Изображение .BMP размером 3289 X 4570 X 32bpp занимает около 53 МБ. Картинка того же размера, но с 24-битным изображением занимает около 43 МБ, а с 16-битным - около 28 МБ. В моем случае файл изображения, обработанный ChemDraw, необходимо преобразовать из 24 бит в 16 бит.
Дальнейшее сравнение шестнадцатеричных данных обоих файлов дает более детальное представление о разнице между изображением, обработанным ChemDraw, и исходным изображением. В частности, ChemDraw хранит EMF_STRETCHDIBITS вместо EMF_STRETCHBLT. Следует добавить, что EMF_STRETCHDIBITS можно сделать, вызвав StretchDIBits при копировании пикселей в TMetaFile/TMetaFileCanvas. Следует также отметить, что пиксели для EMF_STRETCHDIBITS должны быть такими же, как и для EMF_STRETCHBLT.
К сожалению, до сих пор я не выяснил, как именно 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: Я считаю, что Андреас Рейбранд был достаточно любезен, чтобы дать свой ответ, а затем я дал свои комментарии. Но я не могу видеть их сейчас. Это должно быть нормальным поведением системы? о_о
.emf
и посмотрите, какой размер вы получите. Сложная схема в методе 2, кажется, добавляет много ненужных шагов в процесс. Кроме того, детали реализации ChemDraw, вероятно, являются источником любых различий. - person John Alexiou   schedule 05.12.2010