Перейти к содержанию

Изменение цвета пикселей


Рекомендуемые сообщения

Знаю как поменять цвет у определенного пикселя


var PColor:TColor;
R,G,B:byte;
begin
PColor:=Form1.Canvas.Pixels[1,1];
R:=GetRValue(PColor);
G:=GetGValue(PColor);
B:=GetBValue(PColor);
Form1.Canvas.Pixels[5,5]:=RGB(R+30,G+30,;

А как поменять цвет остальных пикселей на форме, находящихся на одинаковом расстоянии друг от друга ? <<--- Не понятное сморозил ;P

Вообщем, пытаюсь сделать что-то вроде точек, как в компиляторе на форме.

snap9ko.jpg

Ссылка на комментарий
Поделиться на другие сайты

Можно взять такой вариант.

unit _Paint;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm2 = class(TForm)
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;
limitX: integer;
limitY: integer;
_Canvas: TCanvas;
_Color: TColor;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
limitX:=10;
limitY:=10;
_Canvas:=Form2.Canvas;
_Color:=0;
end;

procedure TForm2.FormPaint(Sender: TObject);
var
aWidth: integer;
aHeigth: integer;
i,j:integer;
begin
aWidth:=Form2.ClientWidth div limitX;
aHeigth:=Form2.ClientHeight div limitY;

for i:=0 to aWidth do
for j:=0 to aHeigth do
_Canvas.Pixels[i*limitX,j*limitY]:=_color;
end;

end.

Правда есть и более производительный вариант с так называемой "подложкой" - картинокой. Подложка должна рисоваться внутри TForm2.FormPaint на самой Form2а изменяться внутри TForm2.OnResize.

grid.png

Ссылка на комментарий
Поделиться на другие сайты

Так тоже можно (?)


var
x,y: Integer;
begin
for y := 0 to Form1.Height
do for x := 0 to Form1.Width
do if (y mod 5 = 0) and (x mod 5 = 0)
then Form1.Canvas.Pixels[x,y] := clBlack;
end;
procedure TForm1.FormPaint(Sender: TObject);

Ссылка на комментарий
Поделиться на другие сайты

Спасибо SER[G]ANT.

Кстати чтобы тебя цитировать приходиться убирать скобки SER[G]ANT :)

Так тоже можно (?)


var
x,y: Integer;
begin
for y := 0 to Form1.Height
do for x := 0 to Form1.Width
do if (y mod 5 = 0) and (x mod 5 = 0)
then Form1.Canvas.Pixels[x,y] := clBlack;
end;
procedure TForm1.FormPaint(Sender: TObject);

Form1.Height и Form1.Width это не клиентская область поэтому будут некоторые смещения у сетки.

Когда в цикле делаешь do for x := 0 to Form1.Width, то возможно (я точно не помню) это будет сказываться на производительности, т.к. каждый раз будет расчитываться путь до значения "with" через смещение от "Form1." Этот цикл сравнения if (y mod 5 = 0) and (x mod 5 = 0), тоже влияется на производительность. Но я только предполагаю, надо лесть в отлдаку и сравнивать производительность. :)

Ссылка на комментарий
Поделиться на другие сайты

Тогда можно ClientHeight, ClientWidth.

Тогда часть будет использована формы.

А так, вся высота и вся ширина.

Так получается. Быстрее практически не будет...Но сравнить можно.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.