admin

[应用技巧] delphi图像处理 亮度 对比度


function _CheckRgb(Rgb: Integer): Integer;

asm

    test    eax, eax

    jge     @@1

    xor     eax, eax

    ret

@@1:

    cmp     eax, 255

    jle     @@2

    mov     eax, 255

@@2:

end;

 

procedure ImageBrightContrast(var Data: TImageData; Bright, Contrast, Threshold: Integer);

var

  vs: TGrayTable;

  cv: Single;

  i, v: Integer;

  height, dataOffset: Integer;

begin

  if (Bright = 0) and (Contrast = 0) then Exit;

  if Contrast <= -255 then cv := -1 else cv := Contrast / 255;

  if (Contrast > 0) and (Contrast < 255) then

    cv := 1 / (1 - cv) - 1;

  for i := 0 to 255 do

  begin

    if Contrast > 0 then v := _CheckRgb(i + bright) else v := i;

    if Contrast >= 255 then

    begin

      if v >= Threshold then v := 255 else v := 0;

    end

    else

      v := _CheckRgb(v + Round((v - Threshold) * cv));

    if Contrast <= 0 then vs[i] := _CheckRgb(v + bright) else vs[i] := v;

  end;

  asm

    mov     eax, Data

    call    _SetDataRegs

    mov     height, edx

    mov     dataOffset, ebx

    lea     esi, vs;

@@yLoop:

    push    ecx

@@xLoop:

    movzx   eax, [edi].TARGBQuad.Blue

    movzx   ebx, [edi].TARGBQuad.Green

    movzx   edx, [edi].TARGBQuad.Red

    mov     al, [esi+eax]

    mov     bl, [esi+ebx]

    mov     dl, [esi+edx]

    mov     [edi].TARGBQuad.Blue, al

    mov     [edi].TARGBQuad.Green, bl

    mov     [edi].TARGBQuad.Red, dl

    add     edi, 4

    loop    @@xLoop

    pop     ecx

    add     edi, dataOffset

    dec     height

    jnz     @@yLoop

@@Exit:

  end;

end;

 

procedure TForm1.Button3Click(Sender: TObject);

var

  bmp: TGpBitmap;

  g: TGpGraphics;

  data: TImageData;

begin

  bmp := TGpBitmap.Create('..\media\source1.jpg');

  g := TGpGraphics.Create(Canvas.Handle);

  g.DrawImage(bmp, 0, 0);

  data := LockGpBitmap(bmp);

  ImageBrightContrast(data, 50, 0, 121);

  UnlockGpBitmap(bmp, data);

  g.DrawImage(bmp, data.Width, 0);

  g.Free;

  bmp.Free;

end;


#1楼
发帖时间:3月前   |   查看数:0   |   回复数:0
游客组