本文是基于《GDI+在Delphi程序的应用 – Photoshop色相/饱和度/明度功能》一文的BASM实用性过程,有关实现原理可参见《GDI+ 在Delphi程序的应用 -- 图像饱和度调整》和《GDI+ 在Delphi程序的应用 -- 仿Photoshop的明度调整》,纯PAS实现代码和测试例子代码见《GDI+在Delphi程序的应用 – Photoshop色相/饱和度/明度功能》。
过程定义:
// 调整色相/饱和度/明度
procedure ImageHSBAdjustment(Data: TImageData; hValue, sValue, bValue: Integer);
实现代码:
procedure _SetBrightness(Data: TImageData; Value: Integer);
asm
push esi
push edi
push ebx
sar edx, 1 // Value /= 2
movd mm5, edx
punpcklwd mm5, mm5
punpcklwd mm5, mm5
pcmpeqb mm6, mm6
psrlw mm6, 8 // mm4 = 00 FF 00 FF 00 FF 00 FF
pxor mm7, mm7
push edx
call SetDataReg32
pop esi
@yLoop:
push ecx
@xLoop:
mov al, [edi + 3]
movd mm0, [edi]
punpcklbw mm0, mm7
movq mm1, mm0
test esi, esi
js @@1 // if (Value >= 0)
pxor mm0, mm6 // rgb = rgb + (255 - eax) * Value / 128
@@1:
pmullw mm0, mm5 // else
psraw mm0, 7 // rgb = rgb + eax * Value / 128
paddsw mm0, mm1
packuswb mm0, mm7
movd [edi], mm0
mov [edi + 3], al
add edi, 4
loop @xLoop
pop ecx
add edi, ebx
dec edx
jnz @yLoop
emms
pop ebx
pop edi
pop esi
end;
procedure _HueAndSaturation(Data: TImageData; hValue, sValue: Integer);
var
Width, Height, dstOffset: Integer;
S, delta: Integer;
hv, sv: Integer;
asm
push esi
push edi
push ebx
mov hv, edx
mov sv, ecx
call SetDataReg32
mov Width, ecx
mov Height, edx
mov dstOffset, ebx
cld
@yLoop:
push Width
@xLoop:
dec Width
js @@13
movzx ecx, [edi