C#图片处理之:色彩调整

上面有一篇提到了图片明暗的调整,其原理是每个象素的三个颜色分量同时增加或减少一个固定的值。现在更进一步,假如每个象素三个分量增加或减少的值不是相同的呢?嗯,这就今天要讨论的主题了。

应该很容易想明白,假如我们需要一张照片偏红一点,那只需要每个象素的红色分量值都增加就可以了。举个更实际一点的场景,比如要把一张鲜艳的彩色照片处理成泛棕的老旧黑白照,最简单的一个方法就是先把它处理成256级灰阶图,然后增加每个象素的红色分量。

老规矩,给出函数。

 

         /// <summary>
        
/// 色彩调整
        
/// </summary>
        
/// <param name="bmp">原始图</param>
        
/// <param name="rVal">r增量</param>
        
/// <param name="gVal">g增量</param>
        
/// <param name="bVal">b增量</param>
        
/// <returns>处理后的图</returns>

         public   static  Bitmap KiColorBalance(Bitmap bmp,  int  rVal,  int  gVal,  int  bVal)
        
{

            
if (bmp == null)
            
{
                
return null;
            }



            
int h = bmp.Height;
            
int w = bmp.Width;

            
try
            
{
                
if (rVal > 255 || rVal < -255 || gVal > 255 || gVal < -255 || bVal > 255 || bVal < -255)
                
{
                    
return null;
                }


                BitmapData srcData 
= bmp.LockBits(new Rectangle(00, w, h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

                
unsafe
                
{
                    
byte* p = (byte*)srcData.Scan0.ToPointer();

                    
int nOffset = srcData.Stride - w * 3;
                    
int r, g, b;

                    
for (int y = 0; y < h; y++)
                    
{
                        
for (int x = 0; x < w; x++)
                        
{

                            b 
= p[0+ bVal;
                            
if (bVal >= 0)
                            
{
                                
if (b > 255) b = 255;
                            }

                            
else
                            
{
                                
if (b < 0) b = 0;
                            }


                            g 
= p[1+ gVal;
                            
if (gVal >= 0)
                            
{
                                
if (g > 255) g = 255;
                            }

                            
else
                            
{
                                
if (g < 0) g = 0;
                            }


                            r 
= p[2+ rVal;
                            
if (rVal >= 0)
                            
{
                                
if (r > 255) r = 255;
                            }

                            
else
                            
{
                                
if (r < 0) r = 0;
                            }


                            p[
0= (byte)b;
                            p[
1= (byte)g;
                            p[
2= (byte)r;

                            p 
+= 3;
                        }


                        p 
+= nOffset;


                    }

                }
 // end of unsafe

                bmp.UnlockBits(srcData);

                
return bmp;
            }

            
catch
            
{
                
return null;
            }


        }
  //  end of color

 

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ki1381

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值