Главная страница
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.006 c
4-1248152773
Dmitriy
2009-07-21 09:06
2011.05.29
строка "Дополнительные команды инициализации"


15-1297832967
Marygold
2011-02-16 08:09
2011.05.29
грид


2-1298224171
Morgan128
2011-02-20 20:49
2011.05.29
Таблица и EOF


2-1297944223
Ghost del vonte
2011-02-17 15:03
2011.05.29
Указатель на последниий компонент потока


15-1297258085
Tonick2001
2011-02-09 16:28
2011.05.29
Отключение рекции на событие