![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отрисовка на Bitmap
Sergey123 © (2002-12-04 10:43:00)как на Bitmap отобразить массив точек 0..65500, т.е. получить 16bit изображение
MBo (2002-12-04 16:31:00) [1]в хелпе, в msdn.microsoft.com, в книгах
Sergey123 (2002-12-04 16:28:00) [2]Если знаете где про это (Bitmap, Scanline, 16bit, 8bit ...) можно подробнее почитать, подскажите?
Спасибо за помощь.
MBo (2002-12-04 16:25:00) [3]можно сделать только 256 градаций серого в 256-цветном режиме с соотв. палитрой или в 24-битном (16М)режиме, а в 16-битном (64К) - только 32 градации.
Sergey123 (2002-12-04 16:21:00) [4]но у меня то 65535 цветов
MBo (2002-12-04 16:03:00) [5]> a[i,j] := a[i,j] shr TrackBar5.Position;
для 256-цветного режима нужно байтовый массив сделать
>как ее в ч.б. превратить?
MBo © (04.12.02 15:33)
Sergey123 (2002-12-04 15:52:00) [6]a: array [0..511, 0..511] of smallint;
Модифицировал:
for i:=0 to 511 do
for j:=0 to 511 do
a[i,j] := a[i,j] shr TrackBar5.Position;
картинка не очень хороша получается, ну, а как ее в ч.б. превратить?
MBo (2002-12-04 15:48:00) [7]это уж сам догадайся, как модифицировать ;)
Sergey123 (2002-12-04 15:44:00) [8]А у меня массив то из 262144 элементов
MBo (2002-12-04 15:33:00) [9]procedure TForm1.Button4Click(Sender: TObject);
var aw:array[word] of word;
ab:array[word] of byte;
ct:array[0..255] of TRGBQuad;
b:tbitmap;
i,j:integer;
begin
b:=tbitmap.create;
b.pixelformat:=pf8bit;
b.Width := 256;
b.Height := 256;
for i:=0 to 255 do begin
ct[i].rgbRed:=i;
ct[i].rgbBlue:=i;
ct[i].rgbGreen:=i;
ct[i].rgbReserved:=0;
end;
for i:=0 to 65535 do // а у тебя здесь загрузка будет
aw[i]:=i;
for i:=0 to 65535 do
ab[i]:=aw[i] shr 8;
SetDIBColorTable(b.canvas.Handle,0,$100,ct);
SetBitmapBits(b.Handle, sizeof(ab),@ab);
Image1.picture.assign(b);
b.free;
end;
MBo (2002-12-04 15:27:00) [10]procedure TForm1.Button3Click(Sender: TObject);
var a:array[word] of word;
b:tbitmap;
i,j:integer;
begin
b:=tbitmap.create;
b.pixelformat:=pf16bit;
b.Width := 256;
b.Height := 256;
for i:=0 to 65535 do
a[i]:=i;
SetBitmapBits(b.Handle, sizeof(a),@a);
Image1.picture.assign(b);
b.free;
end;
Sergey123 (2002-12-04 15:24:00) [11]Уже нарисовал!
Не могли бы вы мне подсказать, как в таком случае манипулировать цветами полученного изображения (нормируя элементы массива? или как?) и как сделать его черно-белым?
Sergey123 (2002-12-04 15:19:00) [12]Я сделал следующее:
procedure TForm1.Button2Click(Sender: TObject);
var //a:array[0..511,0..511] of word;
ct:array[0..511] of TRGBQuad;
b:tbitmap;
i,j:integer;
f: file;
a: array [0..511, 0..511] of Smallint;
begin
AssignFile(f, "1");
Reset(f, 1);
try
BlockRead(f, a, SizeOf(a));
finally
CloseFile(f);
end;
b:=tbitmap.create;
b.pixelformat:=pf16bit;
b.Width := 512;
b.Height := 512;
{for i:=0 to 511 do begin
ct[i].rgbRed:=i;
ct[i].rgbBlue:=i;
ct[i].rgbGreen:=i;
ct[i].rgbReserved:=0;
end;}
// for i:=0 to 511 do
//for j:=0 to 511 do
//a[i,j]:=trunc(sqrt(i*j));
// SetDIBColorTable(b.canvas.Handle,0,$200,ct);
SetBitmapBits(b.Handle, sizeof(a),@a);
Image1.picture.assign(b);
b.free;
end;
ничего не нарисовал
MBo (2002-12-04 15:12:00) [13]b.pixelformat:=pf16bit;
палитру не надо устанавливать - в таком режиме ее нет.
Но получится цветовая абстракция.
Sergey123 (2002-12-04 15:07:00) [14]а у меня числа в диапазоне -32000 до 32000, может лучше pf16bit и, что тогда получается изменится
MBo (2002-12-04 14:55:00) [15]здесь используется палитра в оттенках серого
твой массив придется перевести в байтовый
вместо SetBitmapBits можно SetDiBits, заполнив предварительно струтуру TBitmapInfo
procedure TForm1.Button1Click(Sender: TObject);
var a:array[0..255,0..255] of byte;
ct:array[0..255] of TRGBQuad;
b:tbitmap;
i,j:integer;
begin
b:=tbitmap.create;
b.pixelformat:=pf8bit;
b.Width := 256;
b.Height := 256;
for i:=0 to 255 do begin
ct[i].rgbRed:=i;
ct[i].rgbBlue:=i;
ct[i].rgbGreen:=i;
ct[i].rgbReserved:=0;
end;
for i:=0 to 255 do for j:=0 to 255 do a[i,j]:=trunc(sqrt(i*j));
SetDIBColorTable(b.canvas.Handle,0,$100,ct);
SetBitmapBits(b.Handle, sizeof(a),@a);
Image1.picture.assign(b);
b.free;
end;
Sergey123 (2002-12-04 14:24:00) [16]Если есть кусочек кода, можно? Как установить подходящую палитру?
MBo (2002-12-04 14:11:00) [17]да, SetDiBits подойдет, только соответствие цветов числам будет экзотическим. Возможно, стоит рисовать в 256-цветном режиме, установив подходящую палитру
Sergey123 (2002-12-04 14:06:00) [18]есть массив 512х512 точек, диапазон от -32000 до 32000, необходимо отобразить его на Image
MBo (2002-12-04 14:02:00) [19]задачу поподробнее.
Подозреваю, что SetDiBits подойдет