怎样让JPG图片加亮

kufor 2008-12-09 01:00:06
procedure TForm1.BitBtn2Click(Sender: TObject);

begin
if (PByte[x*3]<235) and (PByte[x*3+1]<235) and (PByte[x*3+2]<235) then
begin
PByte[x*3]:=PByte[x*3]+20;
PByte[x*3+1]:=PByte[x*3+1]+20;
PByte[x*3+2]:=PByte[x*3+2]+20;
end;
end;
end;
怎样让JPG图片加亮????????????????????????????????????????????
???????????????
...全文
771 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzhifei 2008-12-09
  • 打赏
  • 举报
回复
刚刚优化了一下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, 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;
xzhifei 2008-12-09
  • 打赏
  • 举报
回复
GDI方式需要Uses jpeg;
GDI+方式需要Uses GDIPAPI,GDIPOBJ,GDIPUTIL;
xzhifei 2008-12-09
  • 打赏
  • 举报
回复
两种方法,GDI与GDI+方式:
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;
无条件为你 2008-12-09
  • 打赏
  • 举报
回复
是图片加密吗?使用的时候再还原?
40分有些少。

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧