Delphi图像处理 -- 线性亮度/对比度调整

本文的线性亮度/对比度调整方法是在《改进的图像线性亮度调整方法》一文中线性亮度调整方法与《Delphi图像处理 -- Photoshop图像亮度/对比度调整》中的对比度调整方法基础上形成的,其原理和特点可参见这2篇文章:

过程定义: // 线性调整亮度,Value亮度值 procedure ImageLineBrightness(var Data: TImageData; Value: Integer); // 图像线性亮度/对比度调整。参数同图像亮度/对比度调整过程 procedure ImageLineBrightContrast(var Data: TImageData; Bright, Contrast: Integer; Threshold: LongWord); overload; {$IF RTLVersion >= 17.00}inline;{$IFEND} procedure ImageLineBrightContrast(var Dest: TImageData; const Source: TImageData; Bright, Contrast: Integer; Threshold: LongWord); overload; {$IF RTLVersion >= 17.00}inline;{$IFEND} function ImageLineBrightContrast(var Dest: TImageData; const Source: TImageData; Bright, Contrast: Integer; Threshold: LongWord; Callback: TImageAbort; CallbackData: Pointer): Boolean; overload; 代码实现: procedure ImageLinebrightness(var Data: TImageData; Value: Integer); asm push ebp push esi push edi push ebx test edx, edx jz @@Exit call IsValid32 jc @@Exit push eax mov eax, edx call ClacBrightContrast mov esi, eax pop eax call SetDataRegs32 @@yLoop: push ecx @@xLoop: push ecx mov ecx, 3 @@rgbLoop: movzx eax, [edi] mov ebp, eax // rgb = rgb + rgb * esi / 256 imul eax, esi sar eax, 8 add eax, ebp jns @@1 xor eax, eax @@1: cmp eax, 255 jb @@2 mov eax, 255 @@2: stosb loop @@rgbLoop inc edi pop ecx loop @@xLoop add edi, ebx pop ecx dec edx jnz @@yLoop @@Exit: pop ebx pop edi pop esi pop ebp end; procedure LineBrightContrast(bright, contrast, threshold, cv, bv: Integer); pascal; procedure LineBright; asm cmp bright, 0 je @@end mov ecx, eax // rgb = rgb + rgb * bv / 256 imul eax, bv sar eax, 8 add eax, ecx jns @@end xor eax, eax @@end: end; var height, count: Integer; dstOffset, srcOffset: Integer; asm mov height, edx mov dstOffset, ebx mov srcOffset, eax mov ebx, contrast // ebx = contrast mov edx, threshold @@yLoop: push ecx @@xLoop: push ecx mov count, 3 @@rgbLoop: movzx eax, [esi] // eax = rgb test ebx, ebx jz @@21 // if (contrast > 0) js @@10 // { call LineBright // rgb = rgb + rgb * bv / 256 cmp ebx, 255 jl @@15 // if (contrast >= 255) cmp eax, edx // { jl @@3 // rgb = rgb >= threshold? 255 : 0 mov eax, 255 // goto @@next jmp @@next // } @@3: // } xor eax, eax jmp @@next @@10: cmp ebx, -255 // else if (contrast <= -255) jg @@15 // { mov eax, edx // rgb = threshold; goto @@20 jmp @@20 // } @@15: mov ecx, eax // rgb = rgb + (rgb - threshold) * cv / 256 sub eax, edx imul eax, cv sar eax, 8 add eax, ecx jns @@20 xor eax, eax @@20: test ebx, ebx jg @@22 @@21: call LineBright // if (contrast <= 0) rgb = rgb + rgb * bv / 256 @@22: cmp eax, 255 jbe @@next mov eax, 255 @@next: stosb inc esi dec count jnz @@rgbLoop pop ecx movsb dec ecx jnz @@xLoop add edi, dstOffset add esi, srcOffset pop ecx dec height jnz @@yLoop end; function ImageLineBrightContrast(var Dest: TImageData; const Source: TImageData; Bright, Contrast: Integer; Threshold: LongWord; Callback: TImageAbort; CallbackData: Pointer): Boolean; var cv, bv: Integer; begin Result := False; if ImageEmpty(Dest) or ImageEmpty(Source) then Exit; if Threshold > 255 then Threshold := 255; cv := ClacBrightContrast(Contrast); bv := ClacBrightContrast(Bright); if Assigned(Callback) then Result := ExecuteAbort(Dest, Source, @LineBrightContrast, [Bright, Contrast, Threshold, cv, bv], Callback, CallbackData) else Result := ExecuteProc(Dest, Source, @LineBrightContrast, [Bright, Contrast, Threshold, cv, bv]); end; procedure ImageLineBrightContrast(var Dest: TImageData; const Source: TImageData; Bright, Contrast: Integer; Threshold: LongWord); begin ImageLineBrightContrast(Dest, Source, Bright, Contrast, Threshold, nil, nil); end; procedure ImageLineBrightContrast(var Data: TImageData; Bright, Contrast: Integer; Threshold: LongWord); begin ImageLineBrightContrast(Data, Data, Bright, Contrast, Threshold, nil, nil); end;

代码中对比度调整代码见《Delphi图像处理 -- Photoshop图像亮度/对比度调整》。

文章中所用数据类型及一些过程见《Delphi图像处理 -- 数据类型及内部过程》和《Delphi图像处理 -- 图像像素结构与图像数据转换》。

尽管我十分努力,但水平有限,错误在所难免,欢迎指正和指导。邮箱地址:

[email protected]

本文代码于2010.5.20重新修订过。增加了拷贝形式的调整过程和响应回调函数的调整过程。代码中的ExecuteAbort过程和ExecuteProc过程见《Delphi图像处理 -- 图像像素结构与图像数据转换》。

你可能感兴趣的:(Delphi图像处理 -- 线性亮度/对比度调整)