Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-76494
S
2003-03-12 15:54
2003.03.24
Обработка строки...


1-76421
Programmer1
2003-03-11 17:09
2003.03.24
Как сделать задержку на 5 секудн?


14-76668
Новичек
2003-03-09 11:24
2003.03.24
Новости VCL


7-76704
Brush
2003-02-01 10:45
2003.03.24
Как найти все файлы на компе с заданным расширением,,,


3-76277
Ameno
2003-03-04 08:15
2003.03.24
Преобразование даты в число





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский