![]() |
|
|
Регистрация | << Правила форума >> | 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; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо 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. Вечером опробую "шустрый" вариант)) |