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

Вниз

Как скопировать битмап в массив байтов?   Найти похожие ветки 

 
neodiX ©   (2003-03-11 12:17) [0]

? Желательно с помощью функции move (чтоб быстрее было), a то savetostream очень медлен. Вот в принципе и все.


 
Jel ©   (2003-03-11 12:22) [1]

Работать с пикселами можно и через bitmap.canvas.pixels[x,y], но лучше через scanline.


 
MBo ©   (2003-03-11 12:43) [2]

GetDiBits
GetBitmapBits (устаревшая, но работает)


 
neodiX ©   (2003-03-11 12:57) [3]

bitmap.canvas.pixels[x,y] - работает еще медленее, чем savetostream.
a как с помощью scanline и процедурой move (блин в вопросе написал функция) скопировать бмп в массив. Например у меня даже первая линия не копируется (код ниже не пытается скопировать весь бмп в массив, здесь показано, что даже первая строка не копируется в массив):

procedure TForm1.Button1Click(Sender: TObject);
var b:tbitmap;
i,j:integer;
p:pbytearray;
s:string;
aa:array [0..1024*4] of byte;
begin
b:=ТBitmap.Create;
b.LoadFromFile("f:\file.bmp");
for i:=0 to b.Height-1 do begin
p:=b.ScanLine[i];
move(aa,p^,b.Width);
end;
end;


что я не так делаю? может третий параметр procedure move неправен?



 
neodiX ©   (2003-03-11 13:53) [4]

2 MBo
отвечая на вопрос "Bitmap 8,16(24) bit" автор "rubaxa © (20.12.02 15:46)", ты писал:

MBo © (20.12.02 17:41)
заполняешь bitmapInfo и GetDiBits или SetDiBits


в коде ниже я заполнил структуру TBitmapInfo, но не очень понимаю что подставлять в функции getdibits в 1-ый параметр и вместо массива. В одних источниках, вместо DC, передают "getdc(0)", в "bmp.canvas.handle". И какого типа должен быть массив?

procedure TForm1.Button3Click(Sender: TObject);
var
BitInfo1: TBitmapInfo;
b:tbitmap;
dc1:hdc;
aa:array [0..80000] of byte;
s:string;
begin
b:=tbitmap.Create;
b.LoadFromFile("f:\file.bmp");
ZeroMemory(@BitInfo1, sizeOf(BitInfo1));
with bitinfo1.bmiHeader do
begin
biSize := SizeOf(TBITMAPINFOHEADER);
biWidth := B.Width;
biHeight := B.Height;
biPlanes := 1;
biBitCount := 32;
biCompression := 0;
biSizeimage := 0;
biXPelsPerMeter :=1;
biYPelsPerMeter :=1;
biClrUsed :=0;
biClrImportant :=0;
end;
GetDIBits(b.Canvas.Handle, b.Handle, 0, 0, @aa, BitInfo1, DIB_RGB_COLORS);
end;


что здесь я неправильно делаю?


 
Jel ©   (2003-03-11 13:55) [5]

move(p^, aa[0], b.width);


 
alxx ©   (2003-03-11 13:55) [6]


procedure TForm1.Button1Click(Sender: TObject);
var b:tbitmap;
i,j:integer;
p:pbytearray;
s:string;
aa:array [0..1024*4] of byte;
begin
b:=ТBitmap.Create;
b.LoadFromFile("f:\file.bmp");
for i:=0 to b.Height-1 do begin
p:=b.ScanLine[i];
move(aa,p^,b.Width);
end;
end;


В этом коде нужно определить b.pixelFormat и b.Width и b.Height


 
alxx ©   (2003-03-11 13:57) [7]

Нет, я перепутал направление. Вроде должно и так работать...


 
MBo ©   (2003-03-11 13:58) [8]

type
TRGBQArray=array of TRGBQuad;
var

FA:TRGBQArray;
FInfo:tbitmapinfo;

Value:TBitmap;


FWidth:=Value.Width;
FHeight:=Value.Height;
SetLength(FA,FHeight*FWidth);
with FInfo.bmiHeader do begin
biWidth:=FWidth;
biHeight:=FHeight;
biSize:=SizeOf(TBITMAPINFOHEADER);
biCompression:=BI_RGB;
biBitCount:=32;
biPlanes:=1;
biSizeImage:=0;//((biWidth*biBitCount+31) div 32)*biHeight*4;
end;
GetDIBits(Value.Canvas.Handle,Value.Handle,0,FHeight,FA,FInfo,DIB_RGB_COLORS);


 
neodiX ©   (2003-03-11 14:01) [9]

2 Jel
Точно, блин перепутал source с dest :) (я)
2 Alxx
b.Width и b.Height и b.pixelFormat уже определены, сразу после загрузки битмап"а


 
neodiX ©   (2003-03-11 14:23) [10]

2 MBo
вот код сделаный по твоему шаблону:

procedure TForm1.Button4Click(Sender: TObject);
type
TRGBQArray=array of TRGBQuad;
var
FA:TRGBQArray;
FInfo:tbitmapinfo;
Value:TBitmap;
begin
value:=tbitmap.Create;
value.LoadFromFile("d:\kofe1.bmp");
SetLength(FA,value.Height*value.Width);
with FInfo.bmiHeader do begin
biWidth:=value.Width;
biHeight:=value.Height;
biSize:=SizeOf(TBITMAPINFOHEADER);
biCompression:=BI_RGB;
biBitCount:=24;
biPlanes:=1;
biSizeImage:=((value.Width*24+31) div 32)*value.Height*4;//0
end;
GetDIBits(value.Canvas.Handle,Value.Handle,0,value.Height,FA,FInfo,DIB_RGB_COLORS);
end;


может я неправильно указал biSizeImage, но это не срабатывает..., т.е. когда происходит:
(FA,value.Height*value.Width);
видно, что место в массиве было выделено, но после GetDIBits он пуст... Я наверно явно чего то не понимаю.


 
MBo ©   (2003-03-11 14:41) [11]

biSizeImage должно быть 0 для 24 и 32-битных картинок


 
neodiX ©   (2003-03-11 16:31) [12]

странно, заменил biSizeImage на 0, но WatchList все равно показывает, что пусто :(


 
MBo ©   (2003-03-11 16:34) [13]

код из рабочего примера. Уверен, что PixelFormat совпадает?


 
neodiX ©   (2003-03-11 16:41) [14]

вот, для достоверности чуть переделал:

value:=tbitmap.Create;
value.Width:=100;
value.Height:=100;
BitBlt(value.Canvas.Handle, 0, 0, 100, 100, getdc(0), 0, 0, SRCCOPY);
value.PixelFormat:=pf24bit;
SetLength(FA,value.Height*value.Width);
with FInfo.bmiHeader do begin
biWidth:=value.Width;
biHeight:=value.Height;
biSize:=SizeOf(TBITMAPINFOHEADER);
biCompression:=BI_RGB;
biBitCount:=24;
biPlanes:=1;
biSizeImage:=0;//((value.Width*24+31) div 32)*value.Height*4;
end;
GetDIBits(value.Canvas.Handle,Value.Handle,0,value.Height,FA,FInfo,DIB_RGB_COLORS);


итог тот же...


 
MBo ©   (2003-03-11 16:46) [15]

Вот еще пример со статическим массивом


procedure TForm1.Button2Click(Sender: TObject);
var b:tbitmap;
a:array[0..9,0..9] of TRGBQuad;
s:string;
info:tbitmapinfo;
i,j:integer;
begin
b:=tbitmap.create;
b.PixelFormat:=pf24bit;
b.width:=10;
b.height:=10;
b.Canvas.moveTo(0,0);
b.Canvas.LineTo(6,6);
with info.bmiHeader do begin
biWidth:=b.Width;
biHeight:=b.Height;
biSize:=SizeOf(TBITMAPINFOHEADER);
biCompression:=BI_RGB;
biBitCount:=32;
biPlanes:=1;
biSizeImage:=0;
end;
GetDIBits(b.canvas.handle, B.Handle, 0,B.Height,@a,Info,DIB_RGB_COLORS);
for i:=0 to 9 do begin
s:="";
for j:=0 to 9 do s:=s+inttohex(a[i,j].rgbRed,2)+" ";
memo1.lines.add(s);
end;
image1.picture.assign(b);
b.free;
end;


 
neodiX ©   (2003-03-11 16:54) [16]

Спасибо огромное!
Со стат. масивом все работает.


 
MBo ©   (2003-03-11 17:33) [17]

так и с динамическим все работает.
Вариант обращения -
GetDIBits(value.Canvas.Handle,Value.Handle,0,value.Height,@FA[0],FInfo,DIB_RGB_COLORS);


 
neodiX ©   (2003-03-11 17:38) [18]

Да, действительно. Еще раз спасибо.


 
neodiX ©   (2003-03-11 21:03) [19]

Интересная штука - bmp.savetostream, быстрее заполняет массив байтов, чем:

ниже, львинную долю времени забирает функция scanline, этого можно избжать, если юзать библ. G32, но там нельзя устанавливать pixelformat :(

a:array [0..1023] of byte;
b:array [0..1023*768]

for j:=0 to 1023 do begin
p:=b.scanline[j];
move(p^, a[0], 1024);
for i:=j*1024 to i1*1024+1023 do // все добавляем
b[i]:=a[i-j*1024]; // в оригинальный массив
end;


и


GetDIBits(bmp.Canvas.Handle,bmp.Handle,0,bmp.Height,@FA[0][0],FInfo,DIB_RGB_COLORS); //FA, дин. или стат. массив, не имеет значения


интересно...



Страницы: 1 вся ветка

Текущий архив: 2003.03.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
3-76313
Sergei
2003-03-05 11:23
2003.03.24
ADO Запрос - Insert Into


4-76714
neodiX
2003-01-28 12:11
2003.03.24
Почему не обрабатываются сообщения мыши?


14-76629
Andrey
2003-03-07 19:08
2003.03.24
А как у вас празнуется 8... (ну 7, не принципиально) марта


3-76352
Andy Eremin
2003-03-06 08:47
2003.03.24
пустые поля


1-76425
Mike2003
2003-03-11 12:40
2003.03.24
TCanvas или TImage