1. 程式人生 > >C# 圖片處理之:彩色圖片轉為黑白圖

C# 圖片處理之:彩色圖片轉為黑白圖

首先解釋下所謂的黑白圖片。其實更準確地應該叫256級灰度圖。當一個顏色點的R=G=B時,就是我們所謂的“灰色”。由於RGB的取值範圍在[0,255],所以一共只有256種可能。

所以彩色圖片轉為黑白圖片的原理非常簡單。只要掃描彩圖的每一點,讓輸出圖對應點的R=G=B就成了。現在問題的關鍵就是如何取值了。

一般有兩種,一種是彩圖RGB三分量的算數平均值,另一種是加權平均值。加權平均是考慮到人類眼睛對不同分量的敏感程度。 

 具體程式碼如下:



        
///<summary>
        
/// 變成黑白圖
        
///</summary>
        
///<param name="bmp">
原始圖</param>
        
///<param name="mode">模式。0:加權平均  1:算數平均</param>
        
///<returns></returns>

private Bitmap ToGray(Bitmap bmp,int mode)
        
{
            
if (bmp ==null)
            
{
                
returnnull;
            }


            
int w = bmp.Width;
            
int h 
= bmp.Height;
            
try
            
{
                
byte newColor =0;
                BitmapData srcData 
= bmp.LockBits(new Rectangle(00, w, h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                
unsafe
                
{
                    
byte* p = (byte*)srcData.Scan0.ToPointer();
                    
for (int y =0; y < h; y++)
                    
{
                        
for (int x =0; x < w; x++)
                        
{

                            
if (mode ==0) // 加權平均
{
                                newColor 
= (byte)((float)p[0*0.114f+ (float)p[1*0.587f+ (float)p[2*0.299f);
                            }

                            
else// 算數平均
{
                                newColor 
= (byte)((float)(p[0+ p[1+ p[2]) /3.0f);
                            }

                            p[
0= newColor;
                            p[
1= newColor;
                            p[
2= newColor;

                            p 
+=3;
                        }

                        p 
+= srcData.Stride - w *3;
                    }

                    bmp.UnlockBits(srcData);
                    
return bmp;
                }

            }

            
catch
            
{
                
returnnull;
            }


        }

相關推薦

C# 圖片處理彩色圖片轉為黑白

首先解釋下所謂的黑白圖片。其實更準確地應該叫256級灰度圖。當一個顏色點的R=G=B時,就是我們所謂的“灰色”。由於RGB的取值範圍在[0,255],所以一共只有256種可能。 所以彩色圖片轉為黑白圖片的原理非常簡單。只要掃描彩圖的每一點,讓輸出圖對應點的R=G=B就成了。現

C#圖片處理:在圖片上畫框(圈)

有時候給別人演示圖片,例如培訓某個軟體使用的時候,往往需要在畫面上畫個框或者圈,提醒使用者注意這是個重點。其實這個功能並不難,只需要知道Pen物件的用法就可以了。我們對框或者圈樣式的控制都可以通過對Pen的控制來實現。 /**////<summary>    

C#圖片處理:圖片縮放和剪裁

應聽眾點播要求,今天說說用C#做圖片的縮放和剪裁,相信很多人會對這部分內容感興趣,畢竟這個操作太實用了。 其實在GDI+中,縮放和剪裁可以看作同一個操作,無非就是原始區域的選擇不同罷了。空口無憑,先看具體演算法可能更好理解。         /// <summary&g

圖片處理 Base64

col ack 頁面 發送 http 簡單 文件大小 pan class   網頁上的圖片資源如果采用 http 形式的 url 的話都會額外發送一次請求,網頁發送的 http 請求次數越多,會造成頁面加載速度越慢。而采用Base64格式的編碼,將圖片轉化為字符串後,圖

Android - 圖片處理Glide4.0

郭大神關於Glide文章的連線,很詳細 Android圖片載入框架最全解析(一),Glide的基本用法 Android圖片載入框架最全解析(二),從原始碼的角度理解Glide的執行流程 Android圖片載入框架最全解析(三),深入探究Glide的快取機制 Android圖

Android圖片處理Glide使用大全

        聽說Glide是一個牛逼的圖片載入庫,作者是bumptech,然後這個庫被廣泛的應用在谷歌的官方app裡,也就是谷歌支援我們使用這個來載入圖片庫,所以呢就需要響應谷歌的要求,就像網路訪問我們用volley,然後大部分安卓開發者都棄用eclipse轉戰andro

自然語言處理c++中文分詞(附原始碼)

githup地址:https://github.com/jbymy 一、簡介 中文分詞是地然語言處理中的最基礎的環節,到目前為止已經有不少優秀的分詞工具的出現,如“中科院分詞”,“結

python&圖片處理PIL.Image模組(icon圖示)

2.解壓後,進入到目錄下cd /Users/jianan/Downloads/Imaging-1.1.73.python setup.py install  安裝在/Library/Python/2.7

淺談android中圖片處理圖形變換特效Matrix(四)

今天,我們就來談下android中圖片的變形的特效,在上講部落格中我們談到android中圖片中的色彩特效來實現的。改變它的顏色主要通過ColorMatrix類來實現。 現在今天所講的圖片變形的特效主要就是通過Matrix類來實現,我們通過上篇部落格知道,改變色彩特效,主要

淺談android中圖片處理色彩特效處理ColorMatrix(三)

在android開發中對圖片處理很是頻繁,其中對圖片的顏色處理就是很常見的一種。我們經常看到一些類似美圖秀秀,美顏相機的app,為什麼那麼黑的人拍出來是確實那麼地白呢?長的那麼那個(醜)的人,用美顏相機拍出來的看起來也有那麼回事(拍出來就感覺挺漂亮)。就像網上有個段子,有錢

【Python】圖片處理“PythonMagick”庫簡易安裝筆記

“ImageMagick”可以說是開源的程式碼/命令列版PS,它支援包括建立、編輯、構圖再到格式轉換的圖片處理功能。更重要的是,它幾乎完整支援大部分程式語言,其中Python的介面庫就是“Pytho

自然語言處理搭建基於HanLP的開發環境(轉)

環境搭建比FNLP的簡單,具體參考:https://github.com/hankcs/HanLP 各個版本的下載:https://github.com/hankcs/HanLP/releases 完畢後有一個報錯: 字元型別對應表載入失敗: D:/eclipse_workspace

C#設計模式備忘錄模式

備忘錄模式(Memento) 在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態 UML 程式碼 class Mem

C#設計模式命令模式

命令模式Command 將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化;對請求排隊或記錄請求日誌,以及支援可撤銷操作。 UML 程式碼 abstract class Command

C進階記憶體對齊

什麼是記憶體對齊?  記憶體對齊可以用一句話來概括:  “資料項只能儲存在地址是資料項大小的整數倍的記憶體位置上”。例如int型別佔用4個位元組,地址只能在0,4,8等位置上。  不同型別的資料在記憶體中按照一定的規則排列,而不一定是順序的一個接一個的排列,這就是所謂的

IOS應用開發-圖片處理(拉伸圖片 建立縮 解決圖片旋轉的問題 圖片編碼及上傳 將圖片寫入磁碟)

在做專案時我們經常要對圖片進行一些處理,以達到效能優化或滿足需求。常見的情形有以下幾種 //http://stackoverflow.com/questions/5427656/ios-uiimagepickercontroller-result-image-orien

C#設計模式裝飾模式

裝飾模式(Decorator): 動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生在子類更為靈活 UML類圖 Component 是定義一個物件介面,可以給這些

C#設計模式工廠方法模式

工廠方法模式(Factory Method): 定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類 回顧之前簡單工廠 簡單工廠的核心程式碼 class OperationFactory { public

影象增強處理同態濾波與Retinex演算法(三)Retinex鄰域演算法:SSR,MSR,MSRCR

關於Retinex的基礎知識這裡就不再說了,http://blog.csdn.net/piaoxuezhong/article/details/78248219已經介紹過了,本篇將繼續講一下基於鄰域的

c# 設計模式 工廠模式---工廠模式

gas exec load common pre bubuko 技術分享 ron deb 1、uml類圖: 實現和依賴關系: 實現:   SportFactory、JeepFactory、HatchbackFactory 實現 IFactory 接口   SportCa