Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
8-1088069709
Chery
2004-06-24 13:35
2004.09.12
MediaPlayer, avi.


1-1093626070
Lord de Mon
2004-08-27 21:01
2004.09.12
Как после клика на пункте меню открыть определённую страницу в бр


4-1091037082
Yaral
2004-07-28 21:51
2004.09.12
Шрифты


14-1093400199
SnapIn
2004-08-25 06:16
2004.09.12
Где можно взять MapX ActiveX-компонент?


14-1092479913
YurikGL
2004-08-14 14:38
2004.09.12
Пользователи Active Directory





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский