反白圖檔做環保
2 |
網友山姆先生問了一個有趣問題: 如何在Excel插入(或複製貼上)時將圖片反黑,因為經常會複製一些類似Dos的黑底白字畫面,列印時相當浪費印表機碳粉,很不環保...
這個需求其實不少螢幕擷取工具已內建了現成功能,例如: SnagIt
雖然已有工具,但畢竟還是要幾個操作步驟才能搞定。想了一下,其實應用先前修正VS2010剪貼內容展示過的剪貼簿篡改修改技巧,配合GDI+豐富的圖形處理功能,自己寫應該也不難。再加上寫程式為環保貢獻心力是很有意義的事,所以我索性當成題材小練了一下武功。
以下程式我是寫成Console Application,可以在放捷徑在桌面,抓完DOS畫面後執行它,就可以將剪貼簿中的圖檔"白的說成黑的,黑的說成白的"。程式碼十分簡單,主要是用ColorMatrix類別產生反白效果,反白原理可以看程式註解中的連結文章。
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
namespace InvertClipboardImage
{
class Program
{
[STAThread] //要標註為STAThread才能存取剪貼簿
static void Main(string[] args)
{
//由剪貼簿中取出資料
IDataObject dataObject = Clipboard.GetDataObject();
if (dataObject == null) return;
//若有圖檔資料才處理
if (dataObject.GetDataPresent(DataFormats.Bitmap))
{
Bitmap bmp =
dataObject.GetData(DataFormats.Bitmap) as Bitmap;
//利用ColorMatrix做反白,參考: http://bit.ly/b09Zyz
ColorMatrix cm = new ColorMatrix(
new float[][]
{
new float[] {-1, 0, 0, 0, 0},
new float[] {0, -1, 0, 0, 0},
new float[] {0, 0, -1, 0, 0},
new float[] {0, 0, 0, 1, 0},
new float[] {1, 1, 1, 0, 1}
});
//參考: http://www.bobpowell.net/negativeimage.htm
ImageAttributes ia = new ImageAttributes();
ia.SetColorMatrix(cm);
Graphics g = Graphics.FromImage(bmp);
g.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height),
0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, ia);
g.Dispose();
//將結果存回Clipboard
Clipboard.SetDataObject(bmp, true);
}
}
}
}
Comments
# by 山姆先生
哇! 黑大真的很感謝你~ 我也的快點來練功惹~
# by imiss
在"命令提示字元"視窗的標題列按右鍵→"預設值", 切換到"色彩"頁籤, 將"螢幕文字"設為黑色, "螢幕背景"設為白色, 這樣之後打開預設就是白底黑字了 :) 不過程式碼這麼簡短,還是來練練:P