随笔-10  评论-4  文章-11  trackbacks-0
  2004年10月21日
現在有很多系統都提供讓使用者加入或上傳圖片的功能,
有時候為了限制上傳圖片的尺寸,
避免使用者上傳太大的檔案,造成系統的負擔,
或是像很多照片分享網站(例如:Flickr),也會提供不同的圖片尺寸功能
如果也有類似需求,可以參考以下的範例。

.NET裡的Image這個類別,對於Image檔案的存取提供了很強大的功能,
另外再配合Graphics,就可以很容易的就去做些圖片內容的修改,
有興趣的研究看看。

public void ReSizeImage(string SourceImageFileName, string NewImageFileName)
{
    
double maxHeight = 600D;
    
double maxWidth = 800D;

    Image img1 
= Image.FromFile(SourceImageFileName);

    
double r = System.Math.Min(Convert.ToDouble(maxWidth / img1.Width), (maxHeight / img1.Height));
    
if (r >= 1)
      
throw new Exception("圖片尺寸已經小於限制尺寸");

    Size s 
= new Size();
    s.Height 
= Convert.ToInt32(img1.Height * r);
    s.Width 
= Convert.ToInt32(img1.Width * r);

    Image img2 
= new Bitmap(img1, s);
    img2.Save(NewImageFileName, System.Drawing.Imaging.ImageFormat.Jpeg);
}

參考資料:
Merging Images in .NET - The Code Project

posted @ 2007-09-06 11:58 Jason Cheng 阅读(112) | 评论 (0)编辑
雜湊碼的應用範圍很廣,舉凡密碼的加密,或是檔案傳輸過程的驗證,或是替一組數據(或一個檔案)產生一個短一點的認證碼,.NET Framework已經提供有現成的類別,支援最常用的MD5跟SHA等演算法,下面程式碼簡單示範叫用的程序。

 1 <%@ Page Language="C#" %>
 2 <%@ Import Namespace="System.Security.Cryptography" %>
 3 <%@ Import Namespace="System.Configuration.Provider" %>
 4 
 5 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 6 
 7 <script runat="server">
 8     
 9     
10     protected string ComputeHash(byte[] data, string hashAlgorithmType)
11     {
12         byte[] result;
13         HashAlgorithm s = HashAlgorithm.Create(hashAlgorithmType);
14         if (s == null)
15             throw new ProviderException("Could not create a hash algorithm");
16         result = s.ComputeHash(data);
17         return Convert.ToBase64String(result);
18     }
19 
20     protected void Button1_Click(object sender, EventArgs e)
21     {
22         if (FileUpload1.HasFile)
23         {
24             StringBuilder sb = new StringBuilder();
25             sb.AppendFormat("FileName = {0}<br />", FileUpload1.FileName);
26             sb.AppendFormat("FileSize = {0:#,##0} Bytes<br />", FileUpload1.FileBytes.Length);
27 
28             string[] hashAlgorithms = new string[] { "MD5""SHA1""SHA256""SHA512" };
29             for (int i = 0; i < hashAlgorithms.Length; i++)
30             {
31                 long startTick = DateTime.Now.Ticks;
32                 string smd5 = ComputeHash(FileUpload1.FileBytes, hashAlgorithms[i]);
33                 long endTick = DateTime.Now.Ticks;
34                 double times = (endTick - startTick) / 10000D;
35                 sb.AppendFormat("{0} = {1} ({2}bytes, {3:f4}ms)<br />",hashAlgorithms[i], smd5, smd5.Length, times);
36             }
37             sb.Append("<hr/>");
38 
39             laMessage.Text += sb.ToString();
40         }
41     }
42     protected void Button2_Click(object sender, EventArgs e)
43     {
44         laMessage.Text = "";
45     }
46     
47 </script>
48 
49 <html xmlns="http://www.w3.org/1999/xhtml">
50 <head runat="server">
51     <title>Compute Hash Values</title>
52 </head>
53 <body>
54     <form id="form1" runat="server">
55         <div>
56             <asp:Label ID="Label1" runat="server" Text="Select a file:"></asp:Label>
57             <asp:FileUpload ID="FileUpload1" runat="server" Width="500px" />
58             <br />
59             <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Compute" />
60             <asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Clean" /><br />
61             <br />
62             <asp:Literal ID="laMessage" runat="server"></asp:Literal>
63         </div>
64     </form>
65 </body>
66 </html>
67 


posted @ 2006-11-01 12:06 Jason Cheng 阅读(177) | 评论 (0)编辑

在.NET裡要如何調用外部程式呢??


在.net裡,提供了Process類,提供我們強大的調用外部工具功能,並透過重新導向輸入與輸出,可以取得執行結果,下面就用一個例子來示範在一個WinForm裡輸入一個Dos命令,然後呼叫CMD.EXE來執行,並取回執行的結果。

[程式畫面]


[程式碼]
 1         private string RunCmd(string command)
 2         {
 3             //實例一個Process類,啟動一個獨立進程
 4             Process p = new Process();
 5 
 6             //Process類有一個StartInfo屬性,這個是ProcessStartInfo類,包括了一些屬性和方法,下面我們用到了他的幾個屬性:
 7 
 8             p.StartInfo.FileName = "cmd.exe";           //設定程序名
 9             p.StartInfo.Arguments = "/c " + command;    //設定程式執行參數
10             p.StartInfo.UseShellExecute = false;        //關閉Shell的使用
11             p.StartInfo.RedirectStandardInput = true;   //重定向標準輸入
12             p.StartInfo.RedirectStandardOutput = true;  //重定向標準輸出
13             p.StartInfo.RedirectStandardError = true;   //重定向錯誤輸出
14             p.StartInfo.CreateNoWindow = true;          //設置不顯示窗口
15 
16             p.Start();   //啟動
17             
18             //p.StandardInput.WriteLine(command);       //也可以用這種方式輸入要執行的命令
19             //p.StandardInput.WriteLine("exit");        //不過要記得加上Exit要不然下一行程式執行的時候會當機
20             
21             return p.StandardOutput.ReadToEnd();        //從輸出流取得命令執行結果
22 
23         }

[範例程式碼下載]

posted @ 2006-05-10 16:40 Jason Cheng 阅读(999) | 评论 (2)编辑
因為網頁上有個欄位允許使用者輸入多行文字,可是如果只是單純的把該欄位直接跟Label Binding起來時,顯示出來的結果不會有換行的效果,只要改用自行繫結,然後用下面的方法,把輸出文字裡面的換行文字"\n"轉換成HTML的換行標籤<br>就好了

Eval("Description").ToString().Replace("\n","<br>")
posted @ 2006-03-31 16:45 Jason Cheng 阅读(393) | 评论 (1)编辑
減輕程式碼維護負擔導入塑模導向架構(MDA,Model Driven Architecture)
Delphi 7 Studio以UML技術為基礎,提供視覺化塑模(visual modeling)及重構(Refactoring)工具,有效率地協助您規劃應用程式架構。Delphi 7 Studio Enterprise版本以上內建ModelMaker塑模工具,原生整合於Delphi開發環境中,將視覺化繪製之UML圖形轉換為程式碼。Delphi 7 Studio Architect版所提供之Bold for Delphi塑模環境,進一步提供反向工程(reverse engineering)能力,即時將您的程式碼轉化為視覺化UML圖形,提昇設計與程式碼品質,並可運用現成之設計模式(design patterns)及建立較大之模型(model),節省您寶貴的時間。

Delphi 7 Studio的企業版及專業版內建ModelMaker工具,可以簡化類別(class)及介面的設計、架構及維護工作。ModelMarker是一個CASE(Computer Assisted Software Engineering;電腦協助軟體工程)的工具,可使類別、介面、單元(unit)的開發更容易,讓資訊人員專注於定義物件的成員及相互關係,而不只是乏味地寫程式而已。

在建立好模組之後,ModelMaker可自動轉換成Delphi程式碼。Delphi 7 Studio Architect版所提供的模組環境,不僅將視覺化繪製的UML(Unified Modeling Language)圖形轉換成專案程式碼,更可進一步反向將程式碼轉化成UML圖形,提升設計與程式碼品質。

教學網站:http://www.thoughtsmithy.com/mmjump/MMGettingStarted_Intro.html
posted @ 2004-11-11 10:00 Jason Cheng 阅读(513) | 评论 (0)编辑

XML 序列化 (Serialization) 是將物件公用屬性和欄位轉換為儲存或傳輸所用的序列格式 (此處即為 XML) 的程序。 

using System;
using System.Xml.Serialization;

namespace CarService
{
    
/// <summary>
    
/// car 的摘要描述。
    
/// </summary>

    [XmlInclude(typeof(Car))]
    public class Car
    
{
        
public string petName;
        
public int maxSpeed;

        
public Car() {}

        
public Car(string petName, int speed)
        
{
            
this.petName = petName;
            
this.maxSpeed = speed;
        }

    }

}

posted @ 2004-11-09 11:03 Jason Cheng 阅读(119) | 评论 (0)编辑
今天在Borland Developer Network看到一個新的示範影片,展示如何使用Delphi 2005內建的ECO II,從一個現在的資料庫,自動去讀取資料庫的資料結構與設定,產生EcoSpace裡的Model設定,快速的建立模型驅動的應用程式。

詳細內容:http://bdn.borland.com/article/0,1410,32761,00.html
posted @ 2004-11-08 13:06 Jason Cheng 阅读(149) | 评论 (0)编辑
    Delphi 2005的出現,讓我對Delphi的未來再度充滿希望,其中有一個在之前C# Builder就已經出現的東西Enterprise Core Object (ECO),現在Delphi 2005也出放進去他的新版 ECO II,而且也支援Delphi.NET,現在跟多人都在討論MDA/DDA,自然我也很有興趣,今天第一次接觸,想要了解一下,究竟 What is ECO。

    一剛開始要上手,還真的有點茫茫然的感覺,連Delphi 2005裡面的Demo程式叫出來都沒法正常編譯,New了一個ECO WinForms Application就跑出來好幾個單元,也不曉得要如何開始,既然如此,也只能先找找看有沒有其他資料,再Google上找了一會,終於發現兩篇文章很適合與ECO的第一次接觸。

IBM > DB2 开发者园地 >
使用 Delphi for .NET 为 DB2 数据库设计对象模型
使用 C#Builder Architect 为 DB2 UDB 创建模型驱动的 Windows 应用程序
使用 C#Builder Architect 为 DB2 UDB 构建模型驱动的 Windows 应用程序(第二部分)
 
posted @ 2004-10-29 15:45 Jason Cheng 阅读(224) | 评论 (0)编辑
.Net的平台與技術是越來越成熟與普遍了,其中開發Web Service是很重要的功能,因為個人目前大部分的工作,仍是使用Delphi開發Win32的應用程式,因此便興起了要從Delphi的應用程式去呼叫由.NET開發的Web Server的想法。

由於Delphi 6之後,已經有支援WebSerice的存取,實作起來,困難度並不高,只有遇到一個有關ADO.NET的Dataset傳到Delphi的程式裡面之後,如何轉換成能夠操作的TDataset類別的元件,花了點時間到網路上找到一篇蠻簡單的介紹,解決的這個問題,當然,如果要實用,應該要把這個方法再包裝一下。

參考資料:Use ADO.NET Datasets in Delphi
posted @ 2004-10-28 17:48 Jason Cheng 阅读(207) | 评论 (0)编辑
Borland Delphi 2005即將發行,最近拿到他的測試版,試用了一下,讓我還蠻滿意的,只是一開始程式啟動在載入BPL的時間有點久,這個版本已經能在同一個IDE環境裡開發Win32與.NET的程式,這一點讓我對Delphi的未來繼續充滿希望。

在Borland的網站,現在有兩個有關Delphi 2005的功能介紹:http://www2.borland.com.tw/tw/nw09220401.html

posted @ 2004-10-21 09:37 Jason Cheng 阅读(184) | 评论 (0)编辑