Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Вниз
Проблема с записью в файл значения указателя Найти похожие ветки
← →
Mihey_temporary © (2004-08-29 19:09) [0]Считываю данные о битах из двоичного файла в pf1bit битмап при помощи BlockRead. Размер блока - 1 байт. Использую следующий код:
var RowLength: Integer;
y: Integer;
pb: Pointer;
...
Bitmap1.Monochrome := True;
Bitmap1.PixelFormat := pf1bit;
RowLength := Bitmap1.Width div 8;
...
for y := Bitmap1.Height-1 downto 0 do
begin
pb := Bitmap1[i].ScanLine[y];
BlockRead(SomeFile, pb^, RowLength, amt);
end;
По-моему, он работает корректно, т.е. считывается всё, что надо, судя по отображаемому изображению.
Затем хочу записать это изображение в файл. Использую следующий код (переменные объявлены так же):
RowLength := Bitmap1.Width div 8;
for y := Bitmap1.Height-1 downto 0 do
begin
pb := Bitmap1.ScanLine[y];
Blockwrite(SomeFile, pb^, RowLength, amt);
end;
В результате получаю очень странно работающий код. Например, если имеется не один Bitmap1, а массив битмапов, то при последовательном сохранении двух битмапов не записывается какое-то количество байт первого, хотя если битмап один, всё работает.
Пробовал записывать так:
pByteArray = ^TByteArray;
TByteArray = array[0..32768] of Byte;
var Row: pByteArray;
Row := pByteArray(Bitmap1.Scanline[y]);
Blockwrite(SomeFile, Row, SizeOf(Row), amt);
Записывается столько же байт, сколько и считалось, но вместо той отсутсвующей в первом случае части записывается какая-то чушь, хотя значение каждого байта в pByteArray должно быть равно единице.
В чём ошибка? Если надо, могу привести полный код.
← →
Mihey_temporary © (2004-08-29 19:17) [1]Всё-таки, привожу полный код:
http://www.hot.ee/mvps15/IconLoad.zip [25 Kb]
Это утилита для загрузки кионок из файлов и сохранения туда-же. Почему открытое при помощи OpenIconToBitmap не сохраняется так-же при помощи SaveIconToBitmap (NB! Не обращайте внимание на название процедуры, она должна сохранять иконку в ICO). Пробуйте на вложеной внутри иконке.
← →
MBo © (2004-08-30 07:48) [2]В Save... не хватает
Seek(IconFile, IconDirEntry[i].dwImageOffset);
← →
Mihey_temporary © (2004-08-30 12:40) [3]
> MBo © (30.08.04 07:48) [2]
Но почему, ведь я записываю информацию подряд - header, xor, and, header, xor, and? По идее эти данные следуют друг за другом и позиция файла должна при записи переноситься автоматом.
Кроме того, испытания показывают следующее: если я записываю иконку 32-бит 2 изображения 16х16 и 32х32, то у 16х16 полностью не записывается маска (не хватает 32 бита, 2 байта на ряд).
← →
MBo © (2004-08-30 13:24) [4]>Mihey_temporary
>Но почему, ведь я записываю информацию подряд
Но ведь считываешь не подряд - а как раз с нужного смещения.
>у 16х16 полностью не записывается маска
я добавил в твой код указанную строку, и сохраненный файл стал идентичен первоначальному.
Кстати, не очень хорошо, что размер данных строки считаешь простым div - выравнивание данных на Word или DWord (не помню, как именно в данном случае) может нарушить (для 32х32 это автоматом получается, а вот для других размеров...)
← →
Mihey_temporary © (2004-08-30 15:24) [5]
> MBo © (30.08.04 13:24) [4]
Спасибо, всё заработало.
Но всё же я хочу разобраться с причинами, почему не работало. Я не очень понял вот это:
>Кстати, не очень хорошо, что размер данных строки считаешь простым div - выравнивание данных на Word или DWord (не помню, как именно в данном случае) может нарушить (для 32х32 это автоматом получается, а вот для других размеров...)
Я использую div 8 с рачётом, что размер кратен 8. Что именно может нарушить выравнивание?
← →
MBo © (2004-08-30 15:40) [6]>Что именно может нарушить выравнивание?
Строки битмапа (в том числе и вложенного в иконку, я полагаю)хранятся в памяти так, что каждая строка начинается с адреса, кратного 4-м байтам (или двум, не помню). Если истинная длина не кратна, то строка дополняется (длина округляется вверх). Для 32-битного цвета это условие выполняется автоматически, а вот строка битмапа с pf1bit выравнена на 4 байта только при ширине, кратной 32 пикселам (на 2 байта - кр. 16).
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.04 c