2010年11月26日

ASP.NET Dynamic Image by WPF

[ Download Source Code ]

WPF 是微軟目前最主要的繪圖系統,應用在 ASP.NET Dynamic Image,可以產生許多特效與變化,例如文字特效、相片合成與特效等。



以下範例,我分別建立了 Web Site 與 WPF User Control 兩個專案,並在 Web Site 上,加入 WPF User Control 的參考。建立 Web Site 後,記得先加入下列四組 .dll 參考

  • PresentationCore
  • PresentationFramework
  • System.Xaml
  • WindowsBase

在 Web 上,新增 ImageBuilderHandler.ashx 來處理 Dynamic Image,並在網頁上加入 Image 元件,並設定 ImageUrl 連結 ImageBuilderHandler.ashx



而 ImageBuilderHander.ashx 的程式碼如下:
    public class ImageBuilderHandler : IHttpHandler
    {
        HttpContext m_context;
        byte[] m_imageBuffer = null;

        public void ProcessRequest(HttpContext context)
        {
            m_context = context;
            CreateImage();

            if (m_imageBuffer != null)
            {
                context.Response.ContentType = "image/jpeg";
                context.Response.BinaryWrite(m_imageBuffer);
            }
        }

        void CreateImage()
        {
            Thread worker = new Thread(new ThreadStart(this.CreateImageWorker));
            worker.SetApartmentState(ApartmentState.STA);
            worker.Name = "CreateImageWorker";
            worker.Start();
            worker.Join();
        }

        void CreateImageWorker()
        {
            UserControl control = new UserControl1() { TimeText = DateTime.Now.ToString("HH:mm:ss.f") };

            control.Arrange(new System.Windows.Rect(new System.Windows.Size(control.Width, control.Height)));
            control.UpdateLayout();

            RenderTargetBitmap bitmapRenderer = new RenderTargetBitmap((int)control.ActualWidth, (int)control.ActualHeight, 96, 96, PixelFormats.Default);
            bitmapRenderer.Render(control);

            JpegBitmapEncoder jpeg = new JpegBitmapEncoder();
            jpeg.Frames.Add(BitmapFrame.Create(bitmapRenderer));
            MemoryStream memoryStream = new MemoryStream();
            jpeg.Save(memoryStream);
            m_imageBuffer = memoryStream.ToArray();

            if (bitmapRenderer.Dispatcher.Thread.IsAlive)
                bitmapRenderer.Dispatcher.InvokeShutdown();
        }    

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

程式碼中,UserControl1 即是由 WPF 所產出的,可以利用 XAML 來整合美術設計與程式。
雖然 WPF 的優勢在於互動的介面上,但是用來取代 GDI+ 也是個不錯的選擇。

沒有留言:

Deploying Vue & .NET with Google OAuth on GCP Cloud Run

Deploying Vue & .NET with Google OAuth on GCP Cloud Run Deploying Vue & .NET with Google OAuth on GCP Cloud Run...