Форум: "Начинающим";
Текущий архив: 2011.05.29;
Скачать: [xml.tar.bz2];
ВнизBMP в массив и обратно Найти похожие ветки
← →
Неважно (2011-02-17 16:56) [0]Добрый. Пардон, но где-то туплю. Где? Пока понять не могу.
Код:
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;
← →
RWolf © (2011-02-17 17:19) [1]bmp.SaveToStream не устроит?
← →
Неважно (2011-02-17 17:44) [2]Устроит что угодно, что переводит в массив и обратно.
В Вашем случаи, по каким-то причинам, размер массива увеличен. Т.е. если получить массив по коду выше и по Вашему варианту, то имеем разные массивы.
var M:TMemoryStream;
begin
M:=TMemoryStream.Create;
try
Image1.Picture.Bitmap.SaveToStream(M);
Memo1.Lines.Add(IntToStr( M.Size ));
finally
M.Free;
end;
end;
← →
clickmaker © (2011-02-17 17:45) [3]> по каким-то причинам, размер массива увеличен
потому что сохраняется всё: изображение + заголовок
← →
icWasya © (2011-02-17 17:47) [4]Ваш код предполагает, что PixelFormat = pf24bit.
А это может быть не такж
← →
Неважно (2011-02-17 17:52) [5]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;
← →
RWolf © (2011-02-17 17:56) [6]
> Неважно (17.02.11 17:44) [2]
Мой телепатор подсказывает, что в рассматриваемой задаче важно, чтобы картинка могла сохраняться (bmp.SaveToStream), а потом загружаться из сохранённого (bmp.LoadFromStream), а размер получаемых данных — дело десятое.
← →
Неважно (2011-02-17 18:03) [7]Я, вроде как, задачу озвучил.
Повторюсь:
1) преобразовать BMP в массив;
2) работать с массивом. фильтры всякие
3) преобразовать из массива в BMP
В случаи с SaveToStream массив у меня, по каким-то причинам, больше нужного. Толку-то с ним работать, если он не тот. Может я его не правильно получаю? Может таки можно выделить просто данные без заголовк?
← →
RWolf © (2011-02-17 18:06) [8]Вполне себе тот; просто полезные данные предваряются заголовком BMP (TBitmapFileHeader).
← →
RWolf © (2011-02-17 18:08) [9]
> RWolf © (17.02.11 18:06) [8]
то есть, заголовком и палитрой цветов.
← →
Неважно (2011-02-17 18:19) [10]Это всё хорошо, но как это сделать мне неведомо. Вот в этом и проблема.
← →
clickmaker © (2011-02-17 18:25) [11]> 2) работать с массивом. фильтры всякие
GetDIBits()
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.05.29;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c