![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Уважаемые господа!
Пожалуйста, подскажите, как вывести изображение из массива в Image, используя scanline? В настоящий момент для вывода пользуюсь Canvas.Pixels и всё меня устраивает, но хотелось бы ускорить вывод картинки, почему меня и заинтересовал scanline. Почитал форумы, help, посмотрел примеры, но всё равно до конца не понял как с этим scanline'ом работать. А задача следующая: есть двумерный массив яркостных характеристик (0..639, 0..359) и из него хочется сделать 24-битный битмап и вывести его в Image. На одном форуме нашёл простой пример, который пытался подладить под себя и разобраться: Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
TYPE
pRGBArray = ^TRGBArray;
TRGBArray = ARRAY[0..32767] OF TRGBTriple;
var
x,y : Integer;
BitMap : TBitMap;
P: pRGBArray;
begin
BitMap:= TBitMap.create;
BitMap.Pixelformat:=pf24bit;
Bitmap.Height:=640;
Bitmap.Width:=360;
for y := 0 to 639 do
begin
P := BitMap.ScanLine[y];
for x := 0 to 359 do
P[x].rgbtBlue:= 50;
P[x].rgbtGreen:=120;
P[x].rgbtRed:=0;
end;
image1.Canvas.Draw(0,0,BitMap);
end;
end.Но в итоге закрашивается только часть Image, а сбоку появляется полоска. Пожалуйста, подскажите где я не прав. Скорее всего ошибка с определителем, но именно в этом я и не могу разобраться (где и что пишется) Заранее спасибо! PS. Значения цвета точки (50,120,0) взял для примера. На деле там будут формулы перевода яркостной характеристики в сам цвет. |
|
#2
|
||||
|
||||
|
Код:
for y := 0 to 639 do
begin
P := BitMap.ScanLine[y];
for x := 0 to 359 do
begin // Здесь
P[x].rgbtBlue:= 50;
P[x].rgbtGreen:=120;
P[x].rgbtRed:=0;
end; // Здесь
end; |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Lavr!k (04.09.2013)
| ||
|
#3
|
|||
|
|||
|
Вот ещё шустрый пример из рабочего проекта:
Типы данных: Код:
TRGB32 = packed record
B, G, R, A: Byte;
end;
TRGB32Array = array [0..PixelMax-1] of TRGB32;
PRGB32 = ^TRGB32Array;
pPixelArray = ^TPixelArray;
TPixelArray = array [0..PixelMax-1] of TRGBTriple;Код:
procedure CreateBitmapFromArr(w,h: integer; var bmp: TBitmap);
var
i,j,dd: integer;
Pixels: pPixelArray;
function RGBtoWinRGB(col: TRGB32):TRGBTriple;
begin
result.rgbtBlue:=col.B;
result.rgbtGreen:=col.G;
result.rgbtRed:=col.R;
end;
begin
dd:=0;
bmp.PixelFormat := pf24bit;
bmp.Width := w;
bmp.Height := h;
for i := Bmp.Height - 1 downto 0 do
begin
Pixels:=Bmp.ScanLine[i];
for j :=Bmp.Width - 1 downto 0 do
begin
Pixels[j]:=RGBToWinRGB(FData^[dd]);
inc(DD);
end;
end;
end;FData является переменной типа TRGB32. |
| Этот пользователь сказал Спасибо CynicRus за это полезное сообщение: | ||
Lavr!k (04.09.2013)
| ||
|
#4
|
|||
|
|||
|
Всем спасибо!
Angvelem, действительно: только сейчас заметил, что пропустил Begin/End. Вечером опробую "шустрый" вариант)) |