Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

Проблема с записью в файл значения указателя   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
3-1092701757
Dub
2004-08-17 04:15
2004.09.12
DBGrid


14-1093343366
elected
2004-08-24 14:29
2004.09.12
Ищу работу программистом (удаленно)


1-1093883188
Lord de Mon
2004-08-30 20:26
2004.09.12
Хочу переменной типа стринг присвоить значение с реестра


8-1086939942
gear
2004-06-11 11:45
2004.09.12
WaveInOpen и ACM проблема!


14-1093430638
onix
2004-08-25 14:43
2004.09.12
ServicePak для W2k