Qt图片调整之饱和度调节
2017-01-22 17:07
926 查看
原理较简单不作详述
QImage AdjustSaturation(QImage Img, int iSaturateValue)
{
int red, green, blue, nRed, nGreen, nBlue;
int pixels = Img.width() * Img.height();
unsigned int *data = (unsigned int *)Img.bits();
float Increment = iSaturateValue/100.0;
float delta = 0;
float minVal, maxVal;
float L, S;
float alpha;
for (int i = 0; i < pixels; ++i)
{
nRed = qRed(data[i]);
nGreen = qGreen(data[i]);
nBlue = qBlue(data[i]);
minVal = std::min(std::min(nRed, nGreen), nBlue);
maxVal = std::max(std::max(nRed, nGreen), nBlue);
delta = (maxVal - minVal) / 255.0;
L = 0.5*(maxVal + minVal) / 255.0;
S = std::max(0.5*delta / L, 0.5*delta / (1 - L));
if (Increment > 0)
{
alpha = std::max(S, 1 - Increment);
alpha = 1.0 / alpha - 1;
red = nRed + (nRed - L*255.0)*alpha;
red = (red < 0x00) ? 0x00 : (red > 0xff) ? 0xff : red;
green = nGreen + (nGreen - L*255.0)*alpha;
green = (green < 0x00) ? 0x00 : (green > 0xff) ? 0xff : green;
blue = nBlue + (nBlue - L*255.0)*alpha;
blue = (blue < 0x00) ? 0x00 : (blue > 0xff) ? 0xff : blue;
}
else
{
alpha = Increment;
red = L*255.0 + (nRed - L * 255.0)*(1+alpha);
red = (red < 0x00) ? 0x00 : (red > 0xff) ? 0xff : red;
green = L*255.0 + (nGreen - L * 255.0)*(1+alpha);
green = (green < 0x00) ? 0x00 : (green > 0xff) ? 0xff : green;
blue = L*255.0 + (nBlue - L * 255.0)*(1+alpha);
blue = (blue < 0x00) ? 0x00 : (blue > 0xff) ? 0xff : blue;
}
data[i] = qRgba(red, green, blue, qAlpha(data[i]));
}
return Img;
}
QImage AdjustSaturation(QImage Img, int iSaturateValue)
{
int red, green, blue, nRed, nGreen, nBlue;
int pixels = Img.width() * Img.height();
unsigned int *data = (unsigned int *)Img.bits();
float Increment = iSaturateValue/100.0;
float delta = 0;
float minVal, maxVal;
float L, S;
float alpha;
for (int i = 0; i < pixels; ++i)
{
nRed = qRed(data[i]);
nGreen = qGreen(data[i]);
nBlue = qBlue(data[i]);
minVal = std::min(std::min(nRed, nGreen), nBlue);
maxVal = std::max(std::max(nRed, nGreen), nBlue);
delta = (maxVal - minVal) / 255.0;
L = 0.5*(maxVal + minVal) / 255.0;
S = std::max(0.5*delta / L, 0.5*delta / (1 - L));
if (Increment > 0)
{
alpha = std::max(S, 1 - Increment);
alpha = 1.0 / alpha - 1;
red = nRed + (nRed - L*255.0)*alpha;
red = (red < 0x00) ? 0x00 : (red > 0xff) ? 0xff : red;
green = nGreen + (nGreen - L*255.0)*alpha;
green = (green < 0x00) ? 0x00 : (green > 0xff) ? 0xff : green;
blue = nBlue + (nBlue - L*255.0)*alpha;
blue = (blue < 0x00) ? 0x00 : (blue > 0xff) ? 0xff : blue;
}
else
{
alpha = Increment;
red = L*255.0 + (nRed - L * 255.0)*(1+alpha);
red = (red < 0x00) ? 0x00 : (red > 0xff) ? 0xff : red;
green = L*255.0 + (nGreen - L * 255.0)*(1+alpha);
green = (green < 0x00) ? 0x00 : (green > 0xff) ? 0xff : green;
blue = L*255.0 + (nBlue - L * 255.0)*(1+alpha);
blue = (blue < 0x00) ? 0x00 : (blue > 0xff) ? 0xff : blue;
}
data[i] = qRgba(red, green, blue, qAlpha(data[i]));
}
return Img;
}
相关文章推荐
- Qt图片调整之亮度调节
- Qt图片调整之对比度调节
- 图片饱和度,色相,亮度调整
- 调整图片的饱和度,对比度,色彩,亮度,旋转图片
- iOS中对图片的处理(对图片进行滤镜处理、调整图片饱和度、亮度、对比度、创建一张实时模糊效果 View (毛玻璃效果)、截取一张 view 生成图片)
- Qt学习笔记之图片显示(自动调整大小适应设计的范围)
- 自动播放图片,可以调整速度。
- qt4:给你的窗口设置一个背景图片
- 自动播放图片,可以调整速度。
- smartform中的图片大小调整问题
- js 加载时自动调整图片大小
- C#图片处理之:色彩调整
- 基于j2me的图片特效(缩放,裁剪,调整大小,镜像,对比度亮度调整,黑白,线条,粉笔画)
- GDI+ 在Delphi程序的应用 -- 图像饱和度调整
- 想用JS写一段鼠标拖拽调整图片大小的代码(未完)
- smartform中的图片大小调整问题
- 网页中图片大小自动调整三种方法
- 用AspJpeg调整文字水印透明,生成图片水印的效果
- 自动播放图片,可以调整速度。
- 自制简易图片尺寸调整工具[源]