1,184
社区成员
发帖
与我相关
我的任务
分享procedure GpContrast(var Image: TGPBitmap; Amount: Integer);
var
Data: TBitmapData;
p: PByte;
W, H: integer;
Offset: Integer;
p0: pbytearray;
rg, gg, bg, a, r, g, b, x, y, y0: Integer;
ScanLines: array of Byte;
begin
W := Image.GetWidth;
H := Image.GetHeight;
Image.LockBits(MakeRect(0, 0, W, H), ImageLockModeRead or ImageLockModeWrite, PixelFormat32bppARGB, Data);
SetLength(ScanLines, Data.Height * Data.Stride);
Move(Data.Scan0^, ScanLines[0], Data.Height * Data.Stride);
for y := 0 to H - 1 do
begin
y0 := y * Data.Stride;
for x := 0 to W - 1 do
begin
r := ScanLines[y0 + x * 4];
g := ScanLines[y0 + x * 4 + 1];
b := ScanLines[y0 + x * 4 + 2];
rg := (Abs(127 - r) * Amount) div 255;
gg := (Abs(127 - g) * Amount) div 255;
bg := (Abs(127 - b) * Amount) div 255;
if r > 127 then
r := r + rg
else
r := r - rg;
if g > 127 then
g := g + gg
else
g := g - gg;
if b > 127 then
b := b + bg
else
b := b - bg;
ScanLines[y0 + x * 4] := IntToByte(r);
ScanLines[y0 + x * 4 + 1] := IntToByte(g);
ScanLines[y0 + x * 4 + 2] := IntToByte(b);
end;
end;
Move(ScanLines[0], Data.Scan0^, Data.Height * Data.Stride);
SetLength(ScanLines, 0);
Image.UnlockBits(Data);
end;
function IntToByte(i: Integer): Byte;
begin
if i > 255 then
Result := 255
else if i < 0 then
Result := 0
else
Result := i;
end;
//GDI处理方式
procedure Contrast(var clip: tbitmap; Amount: Integer);
var
p0: pbytearray;
rg, gg, bg, r, g, b, x, y: Integer;
begin
for y := 0 to clip.Height - 1 do
begin
p0 := clip.scanline[y];
for x := 0 to clip.Width - 1 do
begin
r := p0[x * 3];
g := p0[x * 3 + 1];
b := p0[x * 3 + 2];
rg := (Abs(127 - r) * Amount) div 255;
gg := (Abs(127 - g) * Amount) div 255;
bg := (Abs(127 - b) * Amount) div 255;
if r > 127 then
r := r + rg
else
r := r - rg;
if g > 127 then
g := g + gg
else
g := g - gg;
if b > 127 then
b := b + bg
else
b := b - bg;
p0[x * 3] := IntToByte(r);
p0[x * 3 + 1] := IntToByte(g);
p0[x * 3 + 2] := IntToByte(b);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
jpg: TJPEGImage;
bmp: TBitmap;
begin
jpg := TJPEGImage.Create;
bmp := TBitmap.Create;
try
jpg.LoadFromFile('c:\a.jpg');
bmp.Assign(jpg);
Contrast(bmp, 100);
jpg.Assign(bmp);
jpg.SaveToFile('c:\a1.jpg');
finally
jpg.Free;
bmp.Free;
end;
end;
//GDI+处理方式
procedure GpContrast(var Image: TGPBitmap; Amount: Integer);
var
Data: TBitmapData;
p: PByte;
W, H: integer;
Offset: Integer;
p0: pbytearray;
rg, gg, bg, a, r, g, b, x, y: Integer;
begin
W := Image.GetWidth;
H := Image.GetHeight;
Image.LockBits(MakeRect(0, 0, W, H), ImageLockModeRead or ImageLockModeWrite, PixelFormat32bppARGB, Data);
p := Data.Scan0;
Offset := Data.Stride - W * 4;
for y := 0 to H - 1 do
begin
for x := 0 to W - 1 do
begin
r := p^; //red
inc(p);
g := p^; //green
inc(p);
b := p^; //blue
//inc(p);
//a := p^; //alpha
//if a > 0 then
begin
rg := (Abs(127 - r) * Amount) div 255;
gg := (Abs(127 - g) * Amount) div 255;
bg := (Abs(127 - b) * Amount) div 255;
if r > 127 then
r := r + rg
else
r := r - rg;
if g > 127 then
g := g + gg
else
g := g - gg;
if b > 127 then
b := b + bg
else
b := b - bg;
//inc(p^, -2);
p^ := IntToByte(b);
inc(p, -1);
p^ := IntToByte(g);
inc(p, -1);
p^ := IntToByte(r);
end;
inc(p, 4);
end;
Inc(p, Offset);
end;
Image.UnlockBits(Data);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
jpg: TGPBitmap;
Clsid: TGUID;
begin
jpg := TGPBitmap.Create('c:\a.jpg');
try
GpContrast(jpg,100);
if GetEncoderClsid('image/jpeg', Clsid)<>-1 then
jpg.Save('c:\a1.jpg', Clsid);
finally
jpg.Free;
end;
end;