Статьи
|
Для увеличения или уменьшения контрастности растрового изображения, как только мы получим все значения цвета, преобразуем его в целую переменную, а затем вычтем 128. Результат затем умножается на величину Value. Она передается в качестве переменной в нашу процедуру. Нам не нужно редактировать каждый пиксел по отдельности, мы используем массив, в котором предварительно вычисляются значения цвета.
Во-первых, нужно объявить тип:
type
TRGBArray = array[0..0] of TRGBTriple;
pRGBArray = ^TRGBArray;
Далее пишем код:
implementation
{$R *.dfm}
procedure Contrast(const Bitmap: TBitmap; Value: byte);
var
x,y,k: integer;
Target,Source: ^TRGBTriple;
Colorarray: array[0..255] of byte;
mult: single;
begin
mult := 1 + Value /100;
for x := 0 to 255 do
begin
k := Round((integer(x) - 128)*mult) + 128;
if k > 255 then ColorArray[x] := 255
else
if k < 0 then ColorArray[x] := 0
else ColorArray[x] := k;
end;
for y := 0 to Bitmap.Height-1 do
begin
Target := Bitmap.ScanLine[y];
Source := Bitmap.ScanLine[y];
for x := 0 to (Bitmap.Width-1) do
begin
Target^.rgbtRed := Colorarray[Source^.rgbtRed];
Target^.rgbtBlue := Colorarray[Source^.rgbtBlue];
Target^.rgbtGreen := Colorarray[Source^.rgbtGreen];
inc(Target);
inc(Source);
end;
end;
end;
{ Пример использования }
procedure TForm1.Button1Click(Sender: TObject);
begin
Contrast(Image1.Picture.Bitmap,55);
Image1.Repaint;
end;
|