Изменение контрастности изображения
Нам не нужно редактировать каждый пиксел по отдельности, мы используем массив, в котором предварительно вычисляются значения цвета.
Во-первых, нужно объявить тип:
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;
Комментарии