Delphi图像处理 -- RGB与HSL转换
阅读提示:
《Delphi图像处理》系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM。
《C++图像处理》系列以代码清晰,可读性为主,全部使用C++代码。
尽可能保持二者内容一致,可相互对照。
本文代码必须包括文章《Delphi图像处理 -- 数据类型及公用过程》中的ImageData.pas单元。
const
_fc0: Single = 0.0;
_fcd5: Single = 0.5;
_fc1: Single = 1.0;
_fc2: Single = 2.0;
_fc6: Single = 6.0;
_fc60: Single = 60.0;
_fc255: Single = 255.0;
_fc360: Single = 360.0;
_fc510: Single = 510.0; procedure ColorToHSL(var H, S, L: Single; Color: TARGB);
var
rgbMax: LongWord;
asm
push eax
push edx
push ecx
movzx ecx, Color.TARGBQuad.Blue
movzx edx, Color.TARGBQuad.Green
movzx eax, Color.TARGBQuad.Red
cmp ecx, edx // ecx = rgbMax
jge @@1 // edx = rgbMin
xchg ecx, edx
@@1:
cmp ecx, eax
jge @@2
xchg ecx, eax
@@2:
cmp edx, eax
cmova edx, eax
mov rgbMax, ecx
mov eax, ecx
add ecx, edx // ecx = rgbMax + rgbMin
sub eax, edx // delta = rgbMax - rgbmin
cvtsi2ss xmm0, ecx
divss xmm0, _fc510
pop edx
movss [edx], xmm0 // *L = (rgbMax + rgbMin) / 255 / 2
jnz @@3
pop ecx // if (delta == 0)
pop edx // {
mov [ecx], eax // *H = *S = 0
mov [edx], eax // return
jmp @@Exit // }
@@3:
comiss xmm0, _fcd5
jb @@4
neg ecx
add ecx, 510 // if (L < 128) ecx = 510 - ecx
@@4:
pop edx
cvtsi2ss xmm0, eax
cvtsi2ss xmm1, ecx
movaps xmm2, xmm0
divss xmm0, xmm1
movss [edx], xmm0 // *S = delta / ecx
mov eax, rgbMax
cmp al, Color.TARGBQuad.Red
jne @@5
movzx eax, Color.TARGBQuad.Green
movzx edx, Color.TARGBQuad.Blue
xor ecx, ecx // if (R == rgbMax) eax = G - B; add = 0
jmp @@7
@@5:
cmp al, Color.TARGBQuad.Green
jne @@6
movzx eax, Color.TARGBQuad.Blue
movzx edx, Color.TARGBQuad.Red
mov ecx, 120 // if (G == rgbMax) eax = B - R; add = 120
jmp @@7
@@6:
movzx eax, Color.TARGBQuad.Red
movzx edx, Color.TARGBQuad.Green
mov ecx, 240 // if (B == rgbMax) eax = R - G; add = 240
@@7:
sub eax, edx
cvtsi2ss xmm0, eax
cvtsi2ss xmm1, ecx
mulss xmm0, _fc60
divss xmm0, xmm2
addss xmm0, xmm1 // H = eax * 60 / delta + add
comiss xmm0, _fc0
jae @@8
addss xmm0, _fc360
@@8:
pop eax
movss [eax], xmm0
@@Exit:
end; function HSLToColor(H, S, L: Single): TARGB;
asm
movss xmm0, H
comiss xmm0, _fc0
jae @@1
addss xmm0, _fc360
jmp @@2
@@1:
comiss xmm0, _fc360
jb @@2
subss xmm0, _fc360
@@2:
movss xmm3, _fc1
divss xmm0, _fc60
cvtss2si edx, xmm0 // index = Round(H)
cvtsi2ss xmm1, edx
subss xmm0, xmm1 // extra = H - index
comiss xmm0, _fc0 // if (extra < 0) // 如果index发生五入
jae @@3 // {
dec edx // index --
addss xmm0, xmm3 // extra ++
@@3: // }
test edx, 1
jz @@4
movaps xmm1, xmm0
movaps xmm0, xmm3
subss xmm0, xmm1 // if (index & 1) extra = 1 - extra
@@4:
movss xmm2, S
movss xmm4, L
minss xmm2, xmm3
minss xmm4, xmm3
maxss xmm2, _fc0
maxss xmm4, _fc0
pslldq xmm0, 4 // max mid min
movlhps xmm0, xmm3 // xmm0 = 0.0 1.0 extra 0.0
movaps xmm1, xmm0
subss xmm3, xmm2
movss xmm2, _fcd5
pshufd xmm2, xmm2, 0
pshufd xmm3, xmm3, 0
subps xmm1, xmm2
mulps xmm1, xmm3
subps xmm0, xmm1 // xmm0 = xmm0 - (xmm0 - 0.5) * (1.0 - S);
movaps xmm1, xmm0
subss xmm4, xmm2
mulss xmm4, _fc2 // xmm4 = (L - 0.5) * 2
comiss xmm4, _fc0
jb @@5
movss xmm0, _fc1
pshufd xmm0, xmm0, 0
subps xmm0, xmm1 // if (xmm4 >= 0) xmm0 = 1 - xmm0
@@5:
movss xmm3, _fc255
pshufd xmm4, xmm4, 0
pshufd xmm3, xmm3, 0
mulps xmm0, xmm4
addps xmm0, xmm1
mulps xmm0, xmm3 // xmm0 = (xmm0 + xmm0 * xmm4) * 255
jmp @@jmpTable[edx*4].Pointer
@@jmpTable: dd offset @@H60
dd offset @@H120
dd offset @@H180
dd offset @@H240
dd offset @@H300
dd offset @@H360
@@H360: // 300 - 359
pshufd xmm0, xmm0, 11100001b
jmp @@H60
@@H300: // 240 - 299
pshufd xmm0, xmm0, 11010010b
jmp @@H60
@@H240: // 180 - 239
pshufd xmm0, xmm0, 11000110b
jmp @@H60
@@H180: // 120 - 179
pshufd xmm0, xmm0, 11001001b
jmp @@H60
@@H120: // 60 - 119
pshufd xmm0, xmm0, 11011000b
@@H60: // 0 - 59
cvtps2dq xmm0, xmm0
packssdw xmm0, xmm0
packuswb xmm0, xmm0
movd eax, xmm0
or eax, 0ff000000h
end;
《Delphi图像处理》系列使用GDI+单元下载地址和说明见文章《GDI+ for VCL基础 -- GDI+ 与 VCL》。
因水平有限,错误在所难免,欢迎指正和指导。邮箱地址:maozefa@hotmail.com
这里可访问《Delphi图像处理 -- 文章索引》。
Delphi图像处理 -- RGB与HSL转换的更多相关文章
- Delphi图像处理 -- RGB与HSV转换
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- Delphi图像处理 -- 文章索引
转载:http://blog.csdn.net/maozefa/article/details/7188354 本文对已发布<Delphi图像处理>系列文章进行索引链接,以方便阅读和查找. ...
- Atitit 从 RGB 到 HSL 或 HSV 的转换
Atitit 从 RGB 到 HSL 或 HSV 的转换 1.1. 从 RGB 到 HSL 或 HSV 的转换公式与原理1 1.2. public static HSV RGB2HSV(Color ...
- 色彩空间RGB/CMYK/HSL/HSB/HSV/Lab/YUV基础理论及转换方法:RGB与YUV
之前做个设计,现在从事IT,脑子里面关于RGB,RGBA,CMY,CMYK,YUV,但是具体理论还是不扎实.若干年前之前写过<水煮RGB与CMYK色彩模型—色彩与光学相关物理理论浅叙>&l ...
- Delphi图像处理 -- 最大值
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- Delphi图像处理 -- 最小值
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- RGB和HSL色彩的相互转换
转自: http://blog.csdn.net/aniven/article/details/2205851 RGB和HSL(也叫HSB/HSV)是两种色彩空间,即:红,绿,蓝(Red,Green, ...
- Delphi图像处理 -- 颜色矩阵变换
转载自阿发伯:http://blog.csdn.net/maozefa/article/details/8316430 阅读提示: <Delphi图像处理>系列以效率为侧重点,一般 ...
- < python PIL - 批量图像处理 - RGB图像生成灰度图像 >
< python PIL - 批量图像处理 - RGB图像生成灰度图像 > 直接用python自带的PIL图像库,将一个文件夹下所有jpg/png的RGB图像转换成灰度/黑白图像 from ...
随机推荐
- C# 泛型2
我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为方法的参数类 ...
- cocos2dx解析lua table数据结构 简易版.
之前一直用xml填配置, cocos2dx自带了xml解析接口, 非常方便. 但是, 接口好用也改变不了xml的结构字符太多, 书写麻烦, 乱七八糟的事实. 很早就想换lua, 无奈引擎没有现成接口, ...
- 24种设计模式--代理模式【Proxy Pattern】
什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活呀. ...
- Xcode 使用自定义字体
添加对应的字体(.ttf或.odf)到工程的resurce,使用cocos2d中的FontLabel库,FontLabel继承于UILabel,象UILabel一样使用就好了 fontName直接使用 ...
- python3 读写excel
一直认为python3可以很快的实现很多简单的功能,今天要读excel表格数据,想来很简单,网上一搜,用xlrd即可,然后很多人给出了不同的版本,号称xlrd3,实际上官网一看,xlrd0.9.4兼容 ...
- vijos P1055奶牛浴场&& Winter Camp2002
这道题是我在寒假的模拟赛里碰到的,现在想起来仍觉得余味无穷.题目大意大致如下:给你一个矩形并在其中划出一个最大的子矩形,当然,在这个矩形里有些地方是取不到的,也就是说我们划的这个子矩形不能包含这些点( ...
- php && 逻辑与运算符使用说明
例子:!defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc()); o(︶︿︶ ...
- javascript实现ajax
什么是 ajax ajax 即“Asynchronous JavaScript and XML”(异步 JavaScript 和 XML),也就是无刷新数据读取. http 请求 首先需要了解 htt ...
- 使用Raphael 画图(三) 事件 (javascript)
这章展示事件例子. 下图是官方API的事件: 例子: var butt1 = paper.set(); var a1 = paper.circle(24.833, 26.917, 26.667).at ...
- Asp.Net使用异步性能就提升吗
Asp.Net异步编程 随着.Net4.5的推出,一种新的编程方式简化了异步编程,在网上时不时的也看到各种打着Asp.Net异步编程的口号,如何提高性能,如何提高吞吐率! 好多文章都说得不清楚,甚 ...