.Net C# 將 BitmapData 複製到 byte[] Array 陣列

以下有兩種方法複製 BitmapData,一個是使用 unsafe 方法,一個一個 byte 複製,另外一個是複製記憶體區塊,較為快速。

目前測試為,第二種方法比第一種方法快四倍。

            using (Bitmap bmp = new Bitmap("檔案路徑"))
            {
                BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                Stopwatch sw = new Stopwatch();
                sw.Start();
                for (int xx = 0; xx < 1000; xx++)
                {
                    //一個一個byte複製
                    int dataIndex = 0, height = bmpData.Height, width = bmpData.Width;
                    byte[] data = new byte[width * height * 3];
                    unsafe
                    {
                        byte* p = (byte*)bmpData.Scan0.ToPointer();
                        for (int y = 0; y < height; y++)
                        {
                            for (int x = 0; x < width; x++)
                            {
                                data[dataIndex++] = p[0];
                                data[dataIndex++] = p[1];
                                data[dataIndex++] = p[2];
                                p += 3;
                            }
                        }
                    }
                }
                sw.Stop();
                Console.WriteLine("Time1:" + sw.ElapsedMilliseconds.ToString());
                sw.Reset();
                sw.Start();
                for (int xx = 0; xx < 1000; xx++)
                {
                    byte[] data = new byte[bmpData.Width * bmpData.Height * 3];
                    Marshal.Copy(bmpData.Scan0, data, 0, data.Length); //複製記憶體區塊
                }
                sw.Stop();
                Console.WriteLine("Time2:" + sw.ElapsedMilliseconds.ToString());
                bmp.UnlockBits(bmpData);               
            }

  2013-02-22      ez      .NET
.Net C# 利用 VisualBasic 簡體 繁體 大小寫 轉換

之前有一篇 簡體 繁體 轉換,現在多了大小寫轉換,方式差不多,依樣是呼叫 Microsoft.VisualBasic 即可達成。

程式碼如下:

using System;
using System.Text;
using Microsoft.VisualBasic;
namespace StrConv
{
    public partial class Default : System.Web.UI.Page
    {
        public StringBuilder SB = new StringBuilder();
        protected string TestStr = "測試文字abcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()_+~`-=[]\\{}:\";'<>?,./|";
        protected void Page_Load(object sender, EventArgs e)
        {
            ConvertStrConv();
        }
        private void ConvertStrConv()
        {
            //不執行轉換
            DisplayList(VbStrConv.None.ToString(), Strings.StrConv(TestStr, VbStrConv.None));
            //將字串轉換為大寫字元。
            DisplayList(VbStrConv.Uppercase.ToString(), Strings.StrConv(TestStr, VbStrConv.Uppercase));
            //將字串轉換為小寫字元。
            DisplayList(VbStrConv.Lowercase.ToString(), Strings.StrConv(TestStr, VbStrConv.Lowercase));
            //將字串中每個單字的第一個字母轉換為大寫。     
            DisplayList(VbStrConv.ProperCase.ToString(), Strings.StrConv(TestStr, VbStrConv.ProperCase));
            //將字串中的半形字元轉換成全形字元。
            DisplayList(VbStrConv.Wide.ToString(), Strings.StrConv(TestStr, VbStrConv.Wide).Replace("\\", "\"));
            //將字串中的全形字元轉換成半形字元。
            DisplayList(VbStrConv.Narrow.ToString(), Strings.StrConv(TestStr, VbStrConv.Narrow));
            
            //將繁體中文字元轉換成簡體中文。
            DisplayList(VbStrConv.SimplifiedChinese.ToString(), Strings.StrConv(TestStr, VbStrConv.SimplifiedChinese, 2052));
            //將簡體中文字元轉換成繁體中文。
            DisplayList(VbStrConv.TraditionalChinese.ToString(), Strings.StrConv(TestStr, VbStrConv.TraditionalChinese, 1028));
        }
        private void DisplayList(string strVbStrConvName, string strInValue)
        {
            SB.AppendLine(String.Format("VbStrConv:{0} 轉換後 {1} <BR/><BR/>", strVbStrConvName, strInValue));
        }
    
    }
}

  2013-01-25      ez      .NET
MongoDB MS-SQL 效能測試

為了清楚的了解NO-SQL和SQL的效能差異,所以進行了寫入及讀取的效能測試,測試用的電腦則為我的筆電,規格如下:

CPU:Intel Core i7-2630QM

RAM:8GB

OS:Windows 7 Home Premium

HD:Memoright SSD 240G

測試結果可以發現差異非常大喔!MongoDB比MS-SQL速度快上10倍,不過還是需要看個人需求選擇適當的資料庫,以下提供參考。

MongoDB 測試結果:


  2013-01-25      ez      .NET 、   NO-SQL
.Net 檔案名稱 資料夾名稱 包含特殊字元去除

前一篇已經寫過,使用Path.InvalidPathChars即可達到效果,此篇加強了一些功能,程式如下:

        static void Main(string[] args)
        {
            string FileName = "a:\\abc//~!@#$%^&*()_+}{\":?><|.txt...";
            Console.WriteLine(MakeFilenameValid(FileName));
            string FolderName = @"c:\aaa\bbb\ccc\aaa:abc//~!@#$%^&*()_+}{:?><|....";
            Console.WriteLine(MakeFoldernameValid(FolderName));
            Console.Read();
        }
        static string MakeFilenameValid(string FN)
        {
            if (FN == null) throw new ArgumentNullException();
            if (FN.EndsWith(".")) FN = Regex.Replace(FN, @"\.+$", "");
            if (FN.Length == 0) throw new ArgumentException();
            if (FN.Length > 245) throw new PathTooLongException();
            foreach (char c in System.IO.Path.GetInvalidFileNameChars()) FN = FN.Replace(c, '_');
            return FN;
        }
        static string MakeFoldernameValid(string FN)
        {
            if (String.IsNullOrEmpty(FN)) throw new ArgumentNullException();
            if (FN.EndsWith(".")) FN = Regex.Replace(FN, @"\.+$", "");
            if (FN.Length == 0) throw new ArgumentException();
            if (FN.Length > 245) throw new PathTooLongException();
            foreach (char c in System.IO.Path.GetInvalidPathChars()) FN = FN.Replace(c, '_');
            return FN.Replace("/", @"\");
        }

  2013-01-25      ez      .NET
.Net 利用 DotNetZipLib 壓縮檔案 列出壓縮檔

需先下載 DotNetZipLib

官方網站:http://dotnetzip.codeplex.com/

本地下載:DotNetZipLib-DevKit-v1.9

//壓縮檔案
using (ZipFile zip = new ZipFile("壓縮檔案路徑 c:\a.zip"))
{
    //壓縮進度顯示
    zip.SaveProgress += new EventHandler<SaveProgressEventArgs>((s, e) =>
    {
        double Total = e.TotalBytesToTransfer, Now = e.BytesTransferred;
        Console.WriteLine("壓縮進度... ( " + String.Format("{0:0.00}", Math.Round(Now / Total * 100, 2)) + "% )");
    });
    zip.Comment = "壓縮檔註解";
    zip.Password = "壓縮檔密碼";
    zip.CompressionLevel = Ionic.Zlib.CompressionLevel.Level9; //壓縮等級
    zip.MaxOutputSegmentSize = SegmentSize; //壓縮檔分割大小 最多只能分成100個
    zip.AddFile("需壓縮的檔案路徑 c:\aaa.txt", String.Empty);
    zip.Save();
}
//列出壓縮檔
using (ZipFile zip = new ZipFile("壓縮檔案路徑 c:\a.zip"))
{
    foreach (ZipEntry detail in zip) 
    {
        Console.WriteLine(detail.FileName);
    }
}

  2013-01-25      ez      .NET
.Net 的 HttpRuntime.Cache 進階運用 CacheDependency

當使用Cache常會發現,不知道何時要清除快取的窘境,太快清除就無法達到Cache效果,太慢又無法即時更新資訊! 本篇利用CacheDependency偵測檔案變更時,自動清除Cache,達到隨時都是最新資訊。

以下方式即可偵測檔案XXX.dat,如果檔案變更了,就會自動清除Cache:

CacheDependency CD = new CacheDependency(Server.MapPath("~/XXX.dat"));
HttpRuntime.Cache.Add("cache key", "cache body", CD, DateTime.MaxValue, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.High, null);

如果要釋放快取時呼叫指定Function,並且超過20秒未使用也會釋放,如下:

HttpRuntime.Cache.Add("cache key", "cache body", CD, DateTime.Now.AddSeconds(20), TimeSpan.Zero, CacheItemPriority.High, RemovedCallback);
public void RemovedCallback(String k, Object v, CacheItemRemovedReason r)
{
          var key = k;
          var value = v;
}

  2013-01-25      ez      .NET
.Net try cache Exception 錯誤編號

抓取 try cache Exception 錯誤編號 方法如下:

                try
                {
                }
                catch (Exception ex)
                {
                    int ErrorCode = 0;
                    Win32Exception W32EX = ex as Win32Exception;
                    if (W32EX == null) W32EX = ex.InnerException as Win32Exception;
                    if (W32EX != null) ErrorCode = W32EX.ErrorCode;
                    Console.WriteLine(ErrorCode.ToString());
                }

  2013-01-21      ez      .NET
.Net 無法辨識 IE10 導致 _doPostBack 未定義 Javascript 錯誤

程式明明好好的,為什麼切換到IE10就會出現錯誤呢?

原因為 .Net 無法識別 IE 10 的瀏覽器 Header,所以會判斷無法使用指令,此時只要讓 .Net 認得即可。

首先將 .Net Framework 都更新到最新狀態。

利用 cmd 將 browsers 重置,進入 .Net Framework 2.0 或 4.0 目錄。


  2013-06-05      ez      .NET