網友山姆先生問了一個有趣題: 如何在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

Post a comment