Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];

Вниз

Помогите, чтение BMP с измененным заголовком.   Найти похожие ветки 

 
Вика   (2003-06-10 11:50) [0]

Добрый день уважаемые мастера!

У меня следующий вопрос.

У меня есть файлы *.bmp с измененным заголовком.

Необходимо загрузить этот файл в TImage, предварительно
поменяв заголовок, чтобы он был воспринимаем.

В заголовки в нескольких позициях данные либо изменены, либо сдвинуты....

Как добиться восстановления формата bmp и произвести загрузку.

Для примера можно взять измененным позицию

Длина Смещение
Type 2 0 Сигнатура "BM" к примеру на "MB"
ColorTable 1024 54 256 элементов по 4 байта тоже изменено.

Если кому не трудно, или кто-то подобным уже занимался, приложите пример
кода, делательно чтобы работы с файлом была через потомков TStream.

Заранее благодарна!


 
Вика   (2003-06-10 12:52) [1]

Кто нибудь откликнитесь пожалуйста.

Я начала делать, но у меня возникли проблемы

var TempStream:TMemoryStream;
Buf:PChar;
begin
TempStream:=TMemoryStream.Create;
try
OpenDialog1.Filter:="Bitmap Files (*.bmp)|*.bmp";
if OpenDialog1.Execute then begin
TempStream.LoadFromFile(OpenDialog1.FileName);
end;

TempStream.Seek(0,soFromBeginning);
TempStream.ReadBuffer(Buf,2);


RichEdit1.Lines.Add(Buf);
finally
TempStream.Free;
end;



TempStream.Seek(0,soFromBeginning);
TempStream.ReadBuffer(Buf,2);
Здесь я пытаюсь из файла загруженного в буфер считать первые два байта. В них я ожидала получить MB, чтобы потом поменять их на BM, на вместо всего этого я получаю не то, что хотела.


Посмотрите в RichEdit целая строчка, каряк

я‹Ш‹Eр‰Eм;}м}‰}м…цt*‹UмЇUи‹ГѓА3Йи®Эяя‹EмP‹Uь‹‹ГѓА‹ОиХюяял‹MмЇMи‹УѓВ‹Eь‹

Как получить первые два байта и обработать их, чтобы вставить обратно, и как поступить допустим не с символами, такими как BM, а с integer и тому подобное?

Как считать массив integer, проверить и вернуть обратно уже измененные.

Помогите пожалуста!


 
Smithson   (2003-06-10 12:56) [2]

Надо выделить память под buf. Хотя бы банально - S: String; Setlength(S,100); Buf := @S[1];
А так все похоже на правду.


 
Palladin   (2003-06-10 12:56) [3]

buf:pchar это указатель, под него нужно выделять память, что бы работать, это раз
два:

var TempStream:TMemoryStream;
s:string;
begin
TempStream:=TMemoryStream.Create;
try
OpenDialog1.Filter:="Bitmap Files (*.bmp)|*.bmp";
if OpenDialog1.Execute then begin
TempStream.LoadFromFile(OpenDialog1.FileName);
end;

TempStream.Seek(0,soFromBeginning);
SetLengh(s,2);
TempStream.ReadBuffer(s[1],2);


RichEdit1.Lines.Add(s);
finally
TempStream.Free;
end;




 
Вика   (2003-06-10 13:10) [4]

Большое спасибо с вашей помощью с этим я справилась!

А как быть со считыванием числовых полей?
Нужно обязательно массив создавать, чтобы туда по порядочку все вносить или есть способ считать сразу и с этим работать?


 
Вика   (2003-06-10 13:24) [5]

Если не трудно объясните еще вот эту строчку

TempStream.ReadBuffer(s[1],2);

Я понимаю, что будет exception если написать просто S.
S[0] - Element 0 inaccessible - use "Length" or "SetLength"
С этим тоже все понятно.

Но если ReadBuffer(var Buffer; Count:integer);
Как переменной s[1] может быть присвоено несколько символов?
Ведь если попытаться присвоить тоже самое в программе,
получаем
Incompatible types "Char" and "String"


 
Palladin   (2003-06-10 13:28) [6]

а где ты в ReadBuffer(var Buffer; Count:integer);
вообще видишь ограничение на размер buffer?
фактически он записывает 2 байта по адресу @s[1], в s[1] и s[2]...


 
MBo   (2003-06-10 13:37) [7]

>Как переменной s[1] может быть присвоено несколько символов?
По адресу, начинающемуся с адреса этой переменной, пишутся данные.


 
Вика   (2003-06-10 13:38) [8]

Почему данная конструкция

TempStream.Seek(0,soFromBeginning);
SetLength(Str,2);
TempStream.ReadBuffer(Str[1],2);
RichEdit1.Lines.Add(Str);
TempStream.Seek(54,soFromBeginning);
SetLength(Str,10);
TempStream.ReadBuffer(Str[1],10);
RichEdit1.Lines.Add(Str);


Вызывает RichEdit1 line insertion error, а AV никаких нету...


 
Palladin   (2003-06-10 14:02) [9]

потому что видимо в бинарных данных содержатся недопустимые для RichEdit символы, зачем читать все подряд и пытатся вывести это в RichEdit?


 
Вика   (2003-06-10 14:19) [10]


> Palladin © (10.06.03 14:02)
> потому что видимо в бинарных данных содержатся недопустимые
> для RichEdit символы, зачем читать все подряд и пытатся
> вывести это в RichEdit?


Спасибо.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.031 c
3-83866
Andreyki
2003-05-28 20:38
2003.06.26
Сервер БД


1-84226
Artemij
2003-06-11 13:04
2003.06.26
Как получить значение выделенной строки в ListBox?


8-84445
Deedlit
2003-03-10 11:36
2003.06.26
Проблемы с SDK BSPlayer а


3-84019
Alexei Sviridov
2003-05-30 22:41
2003.06.26
Poisk zapisi v Interbase table


14-84630
Liso
2003-06-10 00:22
2003.06.26
zdrastwuj od padruga z polszy





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский