主選單

2017-02-19

C#:常用日期與時間相關處理 (about DateTime)


日期格式轉換,將字串「20170219 013000」轉為 DateTime 格式。
DateTime tmpDate = DateTime.ParseExact("20170219 013000", "yyyyMMdd HHmmss", null);


計算兩個時間的差距,能夠計算相差幾秒、幾個小時或幾天等...,但需注意,要使用「Total」開頭的成員,因為 Seconds 取的是時間的秒數部分,TotalSeconds 才是取得總共有多少秒。
參考資料:https://msdn.microsoft.com/zh-tw/library/system.timespan(v=vs.110).aspx
DateTime StartTime = DateTime.Now.AddDays(-1);
TimeSpan ts = new TimeSpan(DateTime.Now.Ticks - StartTime.Ticks);
Console.Write("共 " + ts.TotalSeconds + " 秒");


測量經過多少時間(類似碼表),評估程式效能時可使用。
System.Diagnostics.Stopwatch myCount = new System.Diagnostics.Stopwatch();//引用stopwatch物件
myCount.Reset(); //時間歸零
myCount.Start(); //開始計時
...
myCount.Stop(); //停止計時
Console.Write("共經過了 " + myCount.Elapsed.TotalMilliseconds.ToString() + " 毫秒");


計算週別 (假設星期天為每週第一天)
參考資料:https://msdn.microsoft.com/zh-tw/library/system.globalization.calendar(v=vs.110).aspx
System.Globalization.Calendar cal = new System.Globalization.CultureInfo("zh-CN").Calendar;
String week = cal.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString().PadLeft(2, '0');
Console.Write("今年的第 " + week + " 週");


C#:網頁畫面轉成圖檔 (web page to image)

透過 WebBrowser 開啟網頁再擷取成圖檔儲存。

加入參考:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

主要程式,新增 WebSiteThumbnail 類別:
public class WebSiteThumbnail
{
    Bitmap m_Bitmap;
    string m_Url;
    int m_BrowserWidth, m_BrowserHeight, m_ThumbnailWidth, m_ThumbnailHeight;

    public WebSiteThumbnail(string Url, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight)
    {
        m_Url = Url;
        m_BrowserHeight = BrowserHeight;
        m_BrowserWidth = BrowserWidth;
        m_ThumbnailWidth = ThumbnailWidth;
        m_ThumbnailHeight = ThumbnailHeight;
    }

    public static Bitmap GetWebSiteThumbnail(string Url, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight)
    {
        WebSiteThumbnail thumbnailGenerator = new WebSiteThumbnail(Url, BrowserWidth, BrowserHeight, ThumbnailWidth, ThumbnailHeight);
        return thumbnailGenerator.GenerateWebSiteThumbnailImage();
    }

    public Bitmap GenerateWebSiteThumbnailImage()
    {
        Thread m_thread = new Thread(new ThreadStart(_GenerateWebSiteThumbnailImage));
        m_thread.SetApartmentState(ApartmentState.STA);
        m_thread.Start();
        m_thread.Join();
        return m_Bitmap;
    }

    private void _GenerateWebSiteThumbnailImage()
    {
        WebBrowser m_WebBrowser = new WebBrowser();
        m_WebBrowser.ScrollBarsEnabled = false;
        m_WebBrowser.Navigate(m_Url);
        m_WebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);
        while (m_WebBrowser.ReadyState != WebBrowserReadyState.Complete)
            Application.DoEvents();
        m_WebBrowser.Dispose();
    }

    private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        WebBrowser m_WebBrowser = (WebBrowser)sender;
        m_WebBrowser.ClientSize = new Size(this.m_BrowserWidth, this.m_BrowserHeight);
        m_WebBrowser.ScrollBarsEnabled = false;
        m_Bitmap = new Bitmap(m_WebBrowser.Bounds.Width, m_WebBrowser.Bounds.Height);
        m_WebBrowser.BringToFront();
        m_WebBrowser.DrawToBitmap(m_Bitmap, m_WebBrowser.Bounds);
        m_Bitmap = (Bitmap)m_Bitmap.GetThumbnailImage(m_ThumbnailWidth, m_ThumbnailHeight, null, IntPtr.Zero);
    }
}

使用方法1 (輸出到網頁串流)
Bitmap m_Bitmap = WebSiteThumbnail.GetWebSiteThumbnail("https://www.google.com.tw", 600, 600, 600, 600);
MemoryStream ms = new MemoryStream();
m_Bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);//JPG、GIF、PNG...
byte[] buff = ms.ToArray();
Response.BinaryWrite(buff);
使用方法2 (儲存為檔案)
Bitmap m_Bitmap = WebSiteThumbnail.GetWebSiteThumbnail("https://www.google.com.tw", 600, 600, 600, 600);
MemoryStream ms = new MemoryStream();
m_Bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);//JPG、GIF、PNG...
System.Drawing.Image postImage = System.Drawing.Image.FromStream(ms);
postImage.Save("D:\\test.Png",System.Drawing.Imaging.ImageFormat.Png); 

原始碼出處:http://m.it610.com/article/1210098.htm
微軟相關資料:https://code.msdn.microsoft.com/windowsapps/CSWinFormSaveWebpageToImage-4dcb7aa6


2017-02-05

扒手妖怪,百百目鬼

暗巷中,一個披著頭巾的女子走來,樣子有點膽怯,但藏在袖裡的手卻又像在尋覓什麼,給人一種不自然的感覺,頭巾中隱約可見的深邃眼矇,讓人無法移開視線,當回過神來,身家早已不翼而飛。



百百目鬼,日文原名為「百々目鬼 ( どどめき ) 」,外形多半被描述為手上長著許多眼睛的女子,通常與「虧心事」、「錢」有關。

據說她可能是鳥山石燕自己所創的妖怪,在他的「今昔畫圖續百鬼」中提到,曾經有一個女孩子,常常喜歡偷人家的錢,結果胳膊上出現了百鳥的眼睛,那是鳥目的精靈所化﹝古:鳥目=錢﹞,稱為百百目鬼,除了上述特徵外,鳥山石燕似乎沒有留下關於她的故事,這讓後人有很大的想像空間。有了妖怪,地方便慢慢會有相關的民間傳說或以她為題材的故事出現,有人認為是錢的精靈為了逞罰作壞事的人,而化為眼睛長在扒手的手上,作虧心事的人容易心虛,被手上的眼睛盯著看一定很不好受,也有人說她能利用手上的眼睛來尋覓目標,或說是被手上的妖怪控制著,說法很多。

傳聞江戶附近出沒著這種妖怪,她起初是個有竊盜癖的人類,某日手上突然長出許多的眼睛,最後成為了妖怪,自此便時常向路人訴說自己的身世並給路人看長滿眼睛的雙手。

在鳥山石燕的畫中,她用一塊布遮著臉,也許不是因為害羞,而是不喜歡手上的那些眼睛盯著自己看吧,洗澡時應該更不方便。就大多數的說法看來,她並不是妖怪,而是被妖怪附身的人,但因為長相與人有異,所以也被人當成了妖怪吧。



鳥山石燕《今昔畫図続百鬼》



2017-02-04

天花板的黑影,天井下

夜裡,老舊木屋的天花板中傳來了詭異的聲音,好像有什麼東西在蠕動著,試著往上方木板的裂縫深處看去,赫然發現一雙眼睛,正在窺視屋內四周,再仔細一瞧,裂縫裡面卻什麼也沒有了,也許只是錯覺吧!是嗎?


天井下,日文原名即為「天井下 ( てんじょうくだり ) 」,是一種住在天花板裡的妖怪,會從木板的裂縫滑出上半身並伸出舌頭竊笑。據說它有著一頭亂髮又全身雜毛,而且裸體﹝...別去想像比較好﹞,一旦被發現,就立刻消失得無影無蹤。它總是躲在天花板裡的暗處,從隙縫中窺視著屋內的情況,有人說它是一種靠人類的生氣來維生的妖怪,通常無害,但有某些記載,它會突然從天花板的裂縫中迅速滑出,抓住底下的人說:「天花板是我的!」,讓人嚇個半死﹝然後呢?﹞。相關的故事中,好像也有以美女造型出現的例子﹝也裸體嗎?﹞

當人身處於陰暗密室的入口或裂縫附近時,常會因為心理作用,覺得裡面有躲東西,天井下可能也是因為這種心理因素而被幻想出來的生物。日本古時候的房屋中,屋頂與天花板之間通常會有一個夾層,終年陰暗,有時會有老鼠﹝或忍者...﹞在那兒活動,再加上古時後的室內照明設備﹝紙罩燈、蠟燭﹞不如今日,不難想像隙縫所發出的怪聲會讓人感到不自在而胡思亂想,也許這就是天井下的由來吧,不過也可能真的是有偷窺狂在那邊活動也說不定。


鳥山石燕《今昔畫図続百鬼》





PS:日本山梨縣北巨摩郡的民間傳說,也有一種外貌像孩童的妖怪「天吊るし (てんづるし)」,會在夜晚從天花板倒吊而下,但也只是單純出現在人面前,不會危害性命。