![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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. Вечером опробую "шустрый" вариант))  |