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

Вниз

Помогите, чтение 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.039 c
1-84158
Child
2003-06-11 13:37
2003.06.26
BackGround формы


1-84087
fs_more
2003-06-09 13:36
2003.06.26
Неопределенность при вызове метода TThread.Terminate


1-84091
Vint45
2003-06-10 14:07
2003.06.26
FillChar и String


7-84767
keymaster
2003-04-16 18:21
2003.06.26
Как запустить ScreenSaver?


14-84687
Fareader
2003-06-03 19:31
2003.06.26
Работа в Днепропетровске