Форум: "Основная";
Текущий архив: 2003.03.24;
Скачать: [xml.tar.bz2];
ВнизКак скопировать битмап в массив байтов? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c