Форум: "Основная";
Текущий архив: 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.027 c