| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Про хранение TBitmap |
| Автор: Ak47black 15.10.2006, 17:34 |
| Привет всем. Вообшем я это вопрос уже создавал на форуме http://forum.vingrad.ru/index.php?showtopic=115873&hl= На первый взгляд все было понятно, но при реализации выяснилось что картинка(TBitmap) в Hex представлении (смотрю через WinHex) отличается по нескольким битам от той которая храниться в настройках форма, (я имею в виду тот кусок кода который храниться после зашифрованного размера), поэтому результат получаеться неправильный. Для меня это странно. Каким путем в делфи высшитываеться представление в Hex ? И самое главное, как мне тогда правильно сделать? |
| Автор: Alexeis 15.10.2006, 17:58 | ||
Где эти биты расположены? |
| Автор: Alexeis 15.10.2006, 18:33 |
А точнее? Смещение относительно начала изображения какое? Похоже просто заголовок битмапа приводится к определенному формату, возможно он вообще сохраняет DDB, вместо DIB. Именно изменены значения? Остольные байты не смещены? |
| Автор: Ak47black 15.10.2006, 18:44 | ||||
| Я шас попробовал мног разных примеров с разными размерами и у меня вышло что давольна-таки много несоотвествий в некоторых случаях Например одно и тоже изображение Вот так в Winhex
Вот так в Delphi настройках
Весь интернет перерыл но про такое нечего нету. |
| Автор: Alexeis 15.10.2006, 18:56 |
| Ak47black, я вижу таки данные имеют сдвиг на "007C0000E00300001F000000" такое число. Такой вопрос - Если содердимое dfm файла сохранить в виде бинарника, то такое изображение откроется графическим редактором? Т.е. у меня остались сомнения, либо изображение конвертируется в другой тип DIB с измененым заголовком, тогда изображение должен легко открыть любой редактор, либо оно конвертирутеся в аппаратный DDB, тогда графические редакторы не смогут его прочитать. Добавлено @ 18:59 Возможно делфи приводит заголовок битмапа, из 5 версии скажем в 4-ю, тогда он должен получится короче на определенное число байт. Добавлено @ 19:05 Хотя не совпадает между 4 -й и 5-й версиями разница в 16 байт, а здесь 12 байт. Нестыковочка. Поскольку все таки выходит, что в Delphi настройках изображение короче, значит вероято это таки DDB. |
| Автор: Ak47black 15.10.2006, 19:08 |
| Попробовал выдернуть из настроек форм изображения (начиная с 42) потом при помоши WinHex сохранил как Hex и в результате все редакторы открывают. Хотя размеры нормаьного изображения и выдернутого различаются. |
| Автор: Alexeis 15.10.2006, 19:10 |
| А изменено значение bfOffBits: DWORD; - т.е. указатель на начало растра, это и не удивительно, раз заголовок сокращен, то начало битовой маски сдвинуто уже на другое число байт. Добавлено @ 19:12 Значит таки просто он снижает версию заголовка, а не конвертирует в DIB (Device Dependent Bitmap- образ битмапа в памяти, который обычно на диске не сохраняют) |
| Автор: Ak47black 15.10.2006, 19:14 | ||||||
Еше первые строки различаються сразу видно
и 4 наподобии. Добавлено @ 19:15
А как мне можно это осушисвить при помоши дельфи? Добавлено @ 19:17 alexeis1 может вы знаете какуюнидь альтернативу тому, как получить код изобрения в формате дельфи кода форм знаю путь нахождения изображения, а то уж слишком тут большие дебри для меня, хотя всеровно попытаюсь осушествить. |
| Автор: Alexeis 15.10.2006, 19:24 |
| пожалуй я неправ размер заголовка в обоих случаях $28 = 40 байт - что соответствует BitmapInfoHeader, значит, за заголовком в оригинале следует еще палитра. Вообще сколько цветов в данном изображении? Больше 256 ? |
| Автор: Ak47black 15.10.2006, 19:25 | ||
Да. |
| Автор: Alexeis 15.10.2006, 19:26 |
Я же сказал уже это смещение на начало растра, поскольку делфи что-то убирает, то и это смещение соответствено указывет уже на другую позицию. Добавлено @ 19:28 Вообще это тогда неважно, делфи должен проглатить и ваш вариант тоже. Оба варианта верны, ничего не нужно менять, просто формат БМП, допускает небольшие модификации, но это никак не скажется на загрузке изображения. Добавлено @ 19:33 ААА блин все вспомнил!!! Формат допускает наличие 3-х масок для выделения каждого из цветов из числа Каждая маска по 4 байта - 4 * 3 = 12! Вот они 12 необязательных байт! Можете не беспокоится. Это не играет в данном случае ни какой роли. Все будет нормально и так, просто TBitmap не хочет записывать эти 12 байт, это его право. Но если они будут, то он все равно прочитает такое изображение. |
| Автор: Ak47black 15.10.2006, 19:39 |
| Да вы правы, получилось Добавлено @ 19:40 Мне еше вот что на счет этого формата непонятно как размер правильно записать там вроде все перевернуто. |
| Автор: Alexeis 15.10.2006, 19:43 |
| Могу даже уверено сказать, что это изображение в формате 5-5-5 т.е. 16 бит на писель |
| Автор: Ak47black 15.10.2006, 19:45 | ||||
В мое прошлом посте вы писали
Hex(3AB10400)=Dec(984679424). Хотя по вашему правильно.
Да.Я ошибилься. |
| Автор: Alexeis 15.10.2006, 19:45 |
Правильно! Байты идут в обратном порядке (порядок процессором интел), просто писать - сразу числом типи DWORD, тогда байты станут на свои места, поскольку и в памяти они в также расположены обратном порядке. |
| Автор: Ak47black 15.10.2006, 19:47 |
| Ну а если например я знаю размер файла то как мне найти эту строку перевернутую ? Добавлено @ 19:48 сразу числом типи DWORD. Неособо представляю как осушествить. |
| Автор: Alexeis 15.10.2006, 19:50 |
| Просто записать в переменную этого типа или Cardinal или Longword и записать ее в файл, оно само запишется как надо! |
| Автор: Ak47black 15.10.2006, 19:53 |
| Ок. Спасибо огромное за помошь |
| Автор: Alexeis 15.10.2006, 19:53 | ||
|