一段rgb轉hsl在計算,再hsl轉會rgb的代碼,怎么用sse匯撰寫
if (hue_ != 0 || saturation_ != 1)
{
for (int i = 0; i < 16; i++)
{
tb = m_b.m128i_u8[i];
tg = m_g.m128i_u8[i];
tr = m_r.m128i_u8[i];
//rgb轉hsl
min = tr;
if (tg < min)
{
min = tg;
}
if (tb < min)
{
min = tb;
}
max = tr;
f2 = tg - tb;
if (tg > max)
{
max = tg;
f1 = 120.0f;
f2 = tb - tr;
}
if (tb > max)
{
max = tb;
f1 = 240.0f;
f2 = tr - tg;
}
dif = (max - min);
sum = (max + min);
l = 0.5f*(float)sum;
if (dif == 0)
{//最大值與最小值相同,則表示為灰色,那么s定義為0,h未定義通常也寫為0
h = 0.0f;
s = 0.0f;
}
else if (l < 127.5f)
{//根據亮度l計算飽和度
s = 255.0f * (float)dif / (float)sum;
}
else
{
s = 255.0f * (float)dif / (510.0f - (float)sum);
}
if (dif != 0)
{
h = (f1 + 60.0f * f2 / (float)dif);//計算色調h
}
if (h < 0.0f)
{
h += 360.0f;
}
if (h > 360.0f)
{
h -= 360.0f;
}
//調整色度
h = h + hue_;
if (h >= 360.0f)
{
h = h - 360.0f;
}
//調整飽和度
s = s * saturation_;
if (s < 0.0f) {
s = 0.0f;
}
if (s > 255.0f) {
s = 255.0f;
}
//HSL 轉換為 RGB
if (s == 0.0f)
{//表示灰色,R,G,B定義為0
tr = (int)l;
tg = (int)l;
tb = (int)l;
}
else
{
if (l < 127.5f)
{
v2 = c1o255_ * l*(255.0f + s);
}
else
{
v2 = l + s - c1o255_*s*l;
}
v1 = 2 * l - v2;
v3 = v2 - v1;
h1 = h + 120.0f;
if (h1 >= 360.0f)
h1 -= 360.0f;
//計算tr
if (h1 < 60.0f)
{
tr = (int)(v1 + v3*h1*c1o60_);
}
else if (h1 < 180.0f)
{
tr = (int)v2;
}
else if (h1 < 240.0f)
{
tr = (int)(v1 + v3*(4.0f - h1*c1o60_));
}
else
{
tr = (int)v1;
}
//計算tg
h1 = h;
if (h1 < 60.0f)
{
tg = (int)(v1 + v3*h1*c1o60_);
}
else if (h1 < 180.0f)
{
tg = (int)v2;
}
else if (h1 < 240.0f)
{
tg = (int)(v1 + v3*(4.0f - h1*c1o60_));
}
else
{
tg = (int)v1;
}
//計算tb
h1 = h - 120.0f;
if (h1 < 0.0f)
{
h1 += 360.0f;
}
if (h1 < 60.0f)
{
tb = (int)(v1 + v3*h1*c1o60_);
}
else if (h1 < 180.0f)
{
tb = (int)v2;
}
else if (h1 < 240.0f)
{
tb = (int)(v1 + v3*(4.0f - h1*c1o60_));
}
else
{
tb = (int)v1;
}
}
if (tb > 255)
{
tb = 255;
}
else if (tb < 0)
{
tb = 0;
}
if (tg > 255)
{
tg = 255;
}
else if (tg < 0)
{
tg = 0;
}
if (tr > 255)
{
tr = 255;
}
else if (tr < 0)
{
tr = 0;
}
m_b.m128i_u8[i] = tb;
m_g.m128i_u8[i] = tg;
m_r.m128i_u8[i] = tr;
}
}
uj5u.com熱心網友回復:
if (l < 127.5f){
//根據亮度l計算飽和度
s = 255.0f * (float)dif / (float)sum;
}
else
{
s = 255.0f * (float)dif / (510.0f - (float)sum);
}
問題在這一塊,我是想這么做
movups xmm1,l //xmm1中是l,l,l,l
movups xmm2,127.5f //xmm2中是127.5f,127.5f,127.5f,127.5f
cmpps xmm1,xmm2,1 // 假如得到xmm1中的值是0,0,-nan,-nan
那么下面的if,else該怎么判斷,是從xmm1中取出其中一個判斷是0還是-nan,還是用其他方式判斷xmm1中的4個標志位,進行ifelse中的操作
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/24843.html
標籤:匯編語言
