![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
BMP в массив и обратно [D7]
Неважно © (2011-02-17 16:56:00)Добрый. Пардон, но где-то туплю. Где? Пока понять не могу.
Код:
procedure GetImage(const BMP: TBitmap; Image: array of byte);
var i, x, y: Integer;
ptr: PByteArray;
begin
i := 0;
for y := 0 to BMP.Height - 1 do
begin
ptr := PByteArray(BMP.ScanLine[y]);
for x := 0 to BMP.Width*3 - 1 do
begin
Image[i] := byte(ptr[x]);
Inc(i);
end;
end;
end;
procedure SetImage(BMP: TBitmap; const Image: array of byte);
var i, x, y: Integer;
ptr: PByteArray;
begin
i := 0;
for y := 0 to BMP.Height - 1 do
begin
ptr := PByteArray(BMP.ScanLine[y]);
for x := 0 to BMP.Width*3 - 1 do
begin
ptr[x] := Image[i];
Inc(i);
end;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var Bitmap,NewBitmap:TBitmap;
sr: array of Byte;
begin
Bitmap:=TBitmap.Create;
try
Bitmap.Assign(Image1.Picture);
SetLength(sr,Bitmap.Width*Bitmap.Height*3);
GetImage(Bitmap,sr);
//
NewBitmap:=TBitmap.Create;
try
NewBitmap.Height:=Bitmap.Height;
NewBitmap.Width:=Bitmap.Width;
SetImage(NewBitmap,sr);
Image2.Picture.Assign(NewBitmap);
finally
NewBitmap.Free;
end;
finally
Bitmap.Free;
end;
end;
clickmaker (2011-02-17 18:25:00) [1]> 2) работать с массивом. фильтры всякие
GetDIBits()
Неважно (2011-02-17 18:19:00) [2]Это всё хорошо, но как это сделать мне неведомо. Вот в этом и проблема.
RWolf (2011-02-17 18:08:00) [3]
> RWolf © (17.02.11 18:06) [8]
то есть, заголовком и палитрой цветов.
RWolf (2011-02-17 18:06:00) [4]Вполне себе тот; просто полезные данные предваряются заголовком BMP (TBitmapFileHeader).
Неважно (2011-02-17 18:03:00) [5]Я, вроде как, задачу озвучил.
Повторюсь:
1) преобразовать BMP в массив;
2) работать с массивом. фильтры всякие
3) преобразовать из массива в BMP
В случаи с SaveToStream массив у меня, по каким-то причинам, больше нужного. Толку-то с ним работать, если он не тот. Может я его не правильно получаю? Может таки можно выделить просто данные без заголовк?
RWolf (2011-02-17 17:56:00) [6]
> Неважно (17.02.11 17:44) [2]
Мой телепатор подсказывает, что в рассматриваемой задаче важно, чтобы картинка могла сохраняться (bmp.SaveToStream), а потом загружаться из сохранённого (bmp.LoadFromStream), а размер получаемых данных — дело десятое.
Неважно (2011-02-17 17:52:00) [7]2 clickmaker © (17.02.11 17:45) [3]
Так а что делать? Я не вижу и не знаю решения.
2 icWasya © (17.02.11 17:47) [4]
> Ваш код предполагает, что PixelFormat = pf24bit.
Думал над этим. Не помогает.
var Bitmap,NewBitmap:TBitmap;
sr: array of Byte;
begin
Bitmap:=TBitmap.Create;
try
Bitmap.Assign(Image1.Picture);
Bitmap.PixelFormat:=pf24bit;
SetLength(sr,Bitmap.Width*Bitmap.Height*3);
GetImage(Bitmap,sr);
//
NewBitmap:=TBitmap.Create;
try
NewBitmap.Height:=Bitmap.Height;
NewBitmap.Width:=Bitmap.Width;
NewBitmap.PixelFormat:=pf24bit;
SetImage(NewBitmap,sr);
Image2.Picture.Assign(NewBitmap);
finally
NewBitmap.Free;
end;
finally
Bitmap.Free;
end;
end;
icWasya (2011-02-17 17:47:00) [8]Ваш код предполагает, что PixelFormat = pf24bit.
А это может быть не такж
clickmaker (2011-02-17 17:45:00) [9]> по каким-то причинам, размер массива увеличен
потому что сохраняется всё: изображение + заголовок
Неважно (2011-02-17 17:44:00) [10]Устроит что угодно, что переводит в массив и обратно.
В Вашем случаи, по каким-то причинам, размер массива увеличен. Т.е. если получить массив по коду выше и по Вашему варианту, то имеем разные массивы.
var M:TMemoryStream;
begin
M:=TMemoryStream.Create;
try
Image1.Picture.Bitmap.SaveToStream(M);
Memo1.Lines.Add(IntToStr( M.Size ));
finally
M.Free;
end;
end;
RWolf (2011-02-17 17:19:00) [11]bmp.SaveToStream не устроит?