1. 程式人生 > >對於圖片的分析以及C#程式碼對圖片進行灰化與反轉

對於圖片的分析以及C#程式碼對圖片進行灰化與反轉

首先,在開始進行C#程式碼之前,我們需要對於圖片的畫素點有一個很好的瞭解。圖片的解析度是指每英寸含有的畫素的個數,畫素就是一個個的小點,每個畫素都有不同的顏色值。單位面積內的畫素越多,解析度越高,影象的效果就越好。因為這些小點越緊湊,小店之間的距離越小,那麼給人眼視覺的感覺就是越清楚。

一般小點之間是有距離的,但是這種距離要比畫素點本身的長度小很多,所以,一張圖片,如果使勁的放大,會發現有鋸齒,也就是畫素小點之間的距離能讓人感覺到了。所以說,要讓人視覺感受圖片質量好,要麼讓小點更加緊湊,因為這樣就感覺不到小點間的距離,要麼就讓人離圖片遠點,因為遠了,人對於小點間的距離感受也就差了。這就是為什麼戶外廣告螢幕的解析度低,因為離得遠,小點間的距離影響小,而手機或者電腦圖片解析度高,因為離得近。

這裡需要注意,列印圖片的時候,也會要求選擇解析度,這裡的解析度是列印解析度,不是圖片的解析度。因為印表機每個單位能夠列印的墨點是一樣的,這時候你選擇的解析度越大,打出來的圖片越長。

為什麼低解析度的圖片在印表機上打印出來不清楚?因為印表機會分析這張圖片,會看看有多少個畫素點,然後把這些畫素點平均分配到你所選擇的列印尺寸上。當你選擇的列印解析度很高,也就是圖片很大的時候,印表機把圖片放大到相應的大小,然後用墨點模擬出這個影象,所以放大後有鋸齒,打印出來依然有鋸齒。

至於為什麼有時候畫素又成了尺寸單位?比如說寫程式碼的時候,生成PDF的時候,畫素又是尺寸單位。因為這時候螢幕每單位的畫素點是一定的,所以畫素越高,尺寸越大。

點陣圖一般用於儲存複雜的圖形元素,比如說攝影。而向量圖雖然無限放大不會失真,但是用於表現過於複雜的圖形相當吃力。一般用於表現繪圖或者生成的線條等內容比較簡單的圖片。在電腦中儲存的時候,畫素點越多,那麼圖片的size就會越大。

好了,接下來進行C#程式碼的操作。其實,歸根到底,對於圖片的操作,就是對於圖片每一個畫素點的操作。我們可以使用C#程式碼獲取這些畫素點,然後對於每一個畫素點的顏色進行操作。最終,會讓這個圖片整體上進行改變。

這裡是一個WinForm的小程式,圖片處理效果如圖所示,這是圖片灰化後的效果,與反轉後的效果。




其程式碼實現也很簡單。

public partial class Main : Form
    {

        private Image imageFile;
        private bool opened = false;
        private Bitmap bitMap;

        public Main()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Console.WriteLine("Click!");

            DialogResult dr = openFileDialog.ShowDialog();
            if (dr == DialogResult.OK)
            {
                imageFile = Image.FromFile(openFileDialog.FileName);
                pictureBox.Image = imageFile;
                opened = true;
                bitMap = new Bitmap(imageFile);
            }
        }

        private void buttonSave_Click(object sender, EventArgs e)
        {
            DialogResult dr = saveFileDialog.ShowDialog();
            if (dr == DialogResult.OK && opened)
            {
                if (openFileDialog.FileName.Substring(openFileDialog.FileName.Length - 3).ToLower() == "png")
                {
                    imageFile.Save(saveFileDialog.FileName + ".png", ImageFormat.Png);
                }
            }
        }

        private void buttonGray_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < bitMap.Width; i++)
            {
                for (int j = 0; j < bitMap.Height; j++)
                {
                    Color origalColor = bitMap.GetPixel(i, j);
                    int grayScale = (int) (origalColor.R*.3 + origalColor.G*.59 + origalColor.B*.11);
                    Color newColor = Color.FromArgb(grayScale, grayScale, grayScale);
                    bitMap.SetPixel(i,j, newColor);
                }
            }

            DialogResult dr = saveFileDialog.ShowDialog();
            if (dr == DialogResult.OK)
            {
                bitMap.Save(saveFileDialog.FileName + ".png", ImageFormat.Png);
                imageFile = Image.FromFile(saveFileDialog.FileName + ".png");
                pictureBox.Image = imageFile;
                pictureBox.Refresh();
            }
   
        }

        private void buttonInvert_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < bitMap.Width; i++)
            {
                for (int j = 0; j < bitMap.Height; j++)
                {
                    Color origalColor = bitMap.GetPixel(i, j);
                    Color newColor = Color.FromArgb(255 -origalColor.R, 255-origalColor.G, 255-origalColor.B);
                    bitMap.SetPixel(i, j, newColor);
                }
            }

            DialogResult dr = saveFileDialog.ShowDialog();
            if (dr == DialogResult.OK)
            {
                bitMap.Save(saveFileDialog.FileName + ".png", ImageFormat.Png);
                imageFile = Image.FromFile(saveFileDialog.FileName + ".png");
                pictureBox.Image = imageFile;
                pictureBox.Refresh();
                bitMap = new Bitmap(imageFile);
            }
        }
    }
}

最核心的程式碼就是下邊這段程式碼,通過雙重的for迴圈,獲取每一個點,然後進行操作。至於灰化過程中,為什麼是將RGB的每一個點的值取出來然後乘以相應的一些數如0.3,0.59等等,這個是從網上找的,估計不屬於程式設計師的範疇,專業的作圖著估計知道怎麼轉化才能達到某種效果。

for (int i = 0; i < bitMap.Width; i++)
{
    for (int j = 0; j < bitMap.Height; j++)
    {
         Color origalColor = bitMap.GetPixel(i, j);
         int grayScale = (int) (origalColor.R*.3 + origalColor.G*.59 + origalColor.B*.11);
         Color newColor = Color.FromArgb(grayScale, grayScale, grayScale);
         bitMap.SetPixel(i,j, newColor);
    }
 }


相關推薦

對於圖片分析以及C#程式碼圖片進行反轉

首先,在開始進行C#程式碼之前,我們需要對於圖片的畫素點有一個很好的瞭解。圖片的解析度是指每英寸含有的畫素的個數,畫素就是一個個的小點,每個畫素都有不同的顏色值。單位面積內的畫素越多,解析度越高,影象的效果就越好。因為這些小點越緊湊,小店之間的距離越小,那麼給人眼視覺的感覺

利用 ELK系統分析Nginx日誌並資料進行視覺展示

一、寫在前面   結合之前寫的一篇文章:Centos7 之安裝Logstash ELK stack 日誌管理系統,上篇文章主要講了監控軟體的作用以及部署方法。而這篇文章介紹的是單獨監控nginx 日誌分析再進行視覺化圖形展示,並在使用者前端使用nginx 來代理kibana

c#中object進行序列和反序列

有時候我們需要對一些資料進行二進位制序列化以達到儲存或傳輸的目的,這裡記錄一下對object的序列化和反序列化操作。 首先引入名稱空間: using System.IO; using System.Runtime.Serialization.Formatters.Bina

C語言圖片進行base64編碼

  本人最近在做基於arm平臺上的Linux系統的人臉識別模組,其中要用到的一小部分就是圖片的base64編碼的實現,自己琢磨了一下寫了一個程式,還挺好用的,可以參考一下。   #include <stdlib.h> #include <stdio.h&

實現正方形圖片dct的c++程式碼(使用AXAT)

#include<iostream> #include<fstream> #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> using

opencv點選滑鼠讀取圖片畫素c++程式碼

程式碼#include<opencv2/opencv.hpp> using namespace std; void onMouse(int event, int x, int y, int flags, void *param) { cv::Mat *im =

Linux 安裝FastDFS圖片伺服器以及配合nginx實現圖片檢視

各位同學,今天我們來學習一下如何安裝FastDFS圖片伺服器,首先我們先來介紹一下什麼是圖片伺服器。 1.什麼是FastDFS FastDFS是用c語言編寫的一款開源的分散式檔案系統。FastDFS為網際網路量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等

Base64圖片編碼(用程式碼替代圖片,有工具可以直接轉換)

base64圖片工具介紹: 1.支援 PNG、GIF、JPG、BMP、ICO 格式。 2.將圖片轉換為Base64編碼,可以讓你很方便地在沒有上傳檔案的條件下將圖片插入其它的網頁、編輯器中。 這對於一些小的圖片是極為方便的,因為你不需要再去尋找一個儲存圖片的地方。 3.假定生成的程式碼為

找出陣列中第k大的數(時間複雜度分析C++程式碼實現). TopK in array. ( leetcode

找出陣列中第k大的數. TopK in array. ( leetcode - 215 ) 最近面試過程中遇到的一個題目,也是大資料時代常見的題目,就來總結一下。 面試題目: 1、10億數中,找出最大的100個數。用你能想到的最優的時間和空間效率。 2

三種工廠模式的分析以及C++實現

以下是我自己學習設計模式的思考總結。 1.簡單工廠模式 簡單工廠模式是工廠模式中最簡單的一種,他可以用比較簡單的方式隱藏建立物件的細節,一般只需要告訴工廠類所需要的型別,工廠類就會返回需要的產品類,但客戶端看到的只是產品的抽象物件,無需關心到底是返回了哪

一 .fastDFS:Linux 搭建分散式檔案儲存FastDFS圖片伺服器以及配合nginx / 使用Nginx進行負載均衡

    Linux 安裝分散式檔案儲存FastDFS圖片伺服器以及配合nginx/使用Nginx進行負載均衡 alfresco    虛擬網路編輯器修改閘道器    修改成對應的閘道器及ip:vim /etc/syscon

經典Top-K問題最優解決辦法以及C++程式碼實現

問題描述:Top-K問題是一個十分經典的問題,一般有以下兩種方式來描述問題:在10億的數字裡,找出其中最大的100個數;或者在一個包含n個整數的陣列中,找出最大的100個數。    前邊兩種問題描述稍有區別,但都是說的Top-K問題,前一種描述方式是說這裡也許沒有足夠的空間儲

結構體中指標賦值問題的分析C程式碼示例

問題描述 某結構體的定義如下: typedef struct { int iAge; // 年齡 char szAddr1[100]; // 地址1 char *psz

搭建SonarQube分析Objective-C程式碼遇到的問題

1、Object-C外掛收費 SonarQube更新中心進入非常慢,我好不容易把C / C++ / Objective-C外掛下下來了,結果執行的時候告訴我要收費,只好嘗試另闢蹊徑,後來找到了免費的版本,進入https://github.com/octo-technolog

BP神經網路原理分析c++程式碼實現(上)

    本部落格所述BP神經網路,是本人研究總結的結果,希望對您有所幫助,當然,如果有需要,大家可以互相交流。    設計一個BP神經網路類,來實現一個BP神經網路。要求輸入層節點數、隱層數、隱層節點數、輸出層節點數、傳遞函式、演算法等等可以由使用者自主設定。 神經網路

android JNI C程式碼sdcard中檔案的操作

- 所有操作除路徑不同其它全部相同,如:fopen, fclose, fread ... - 別忘記把許可權加上,如下:     <uses-permission android:name="android.permission.WRITE_EXTERNAL_S

使用C#Excel進行讀寫操作(NPOI)以及使用EFMysql進行CURD

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq;

BP神經網路原理分析c++程式碼實現(下)

為了方便廣大使用者的使用,本人將BP神經網路寫成了一個BPNNS類,這樣使用者們可以很方便的將此類潛入到自己的工程當中,此類的具體的使用規則,下面會介紹。 /*********************************************************

.pgm圖片簡介以及Python讀取.pgm圖片的方法

一、什麼是.pgm圖片? .pgm檔案由於模式的不同其資料儲存方式也有所不同,下面介紹P2和P5模式的.pgm檔案的格式。 1、P2模式的.pgm檔案 P2模式的.pgm檔案儲存如下圖所示: 其內容釋義如下: ①第一行內容“P2”表示.pgm

C#中DataTable進行全連接後group by,orderby

orderby utime mp3 var c# put enume enum solver var result = from temp2 in ( f