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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
10-1174567553
Indigoo
2007-03-22 15:45
2011.05.29
"Range check error" в ActiveX


2-1297931315
Den
2011-02-17 11:28
2011.05.29
Поиск контрола на чужой форме


10-1169119535
Brenagwynn
2007-01-18 14:25
2011.05.29
сервис и COM


3-1259512660
lamer6666
2009-11-29 19:37
2011.05.29
Zeos и MySQL


15-1297348833
delphi_developer
2011-02-10 17:40
2011.05.29
Программирование под iPhone