[ASP.NET] プロ生ちゃん壁紙ジェネレーター 2

Development,Pronama-chanASP.NET,Visual Basic

先日の プロ生ちゃん 壁紙ジェネレーター 2 のコードを公開しておきます。いわゆる classic ASP.NET (Web forms) です。

aspnet

jz5/pronama-chan-wallpaper2

サーバー側で画像を合成してます。HTML5 + JavaScript で合成は、プロ生ちゃん アイコンジェネレーター などを見てください。

壁紙ジェネレーター ASP.NET Tips

コードのポイントをまとめておきます。

GET パラメータークエリーの取得と URL か判定


Dim q = Context.Request.QueryString.Get("q")
If Not Uri.IsWellFormedUriString(q, UriKind.Absolute) Then
Exit Sub
End If
Dim url = New Uri(q)

view raw

gistfile1.vb

hosted with ❤ by GitHub

URL から Bitmap の生成


Dim webBmp As Bitmap
Using wc = New WebClient
webBmp = New Bitmap(wc.OpenRead(url))
End Using

view raw

gistfile1.vb

hosted with ❤ by GitHub

サーバーのディレクトリにある画像の読み込み


Dim wallBmp = New Bitmap(System.IO.Path.Combine(Server.MapPath("./"), "wallpaper.png"))

view raw

gistfile1.vb

hosted with ❤ by GitHub

描画先の範囲に合せて、画像の合成

左右・上下に空きがないよう、Web 画像を拡大・縮小して必要な範囲を描画します。


Dim dst = New Rectangle(754, 18, 1110, 807) ' 描画先の位置・大きさ
Dim src = New Rectangle(0, 0, webBmp.Width, webBmp.Height) ' 参照画像の位置・大きさ
If dst.Width / dst.Height < webBmp.Width / webBmp.Height Then
Dim w = dst.Width / (dst.Height / webBmp.Height)
src.X = Convert.ToInt32((webBmp.Width – w) / 2)
src.Width = Convert.ToInt32(w)
Else
Dim h = dst.Height / (dst.Width / webBmp.Width)
src.Y = Convert.ToInt32((webBmp.Height – h) / 2)
src.Height = Convert.ToInt32(h)
End If
Dim wallBmp = New Bitmap(System.IO.Path.Combine(Server.MapPath("./"), "wallpaper.png"))
Dim outBmp = New Bitmap(wallBmp.Width, wallBmp.Height)
Using g = Graphics.FromImage(outBmp)
g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
g.DrawImage(webBmp, dst, src, GraphicsUnit.Pixel)
g.DrawImage(wallBmp, 0, 0, wallBmp.Width, wallBmp.Height)
End Using

view raw

gistfile1.vb

hosted with ❤ by GitHub

Content-Type image/png としてレスポンスを返す(画像の出力)


Response.ContentType = "image/png"
Response.Flush()
outBmp.Save(Response.OutputStream, Imaging.ImageFormat.Png)
Response.End()

view raw

gistfile1.vb

hosted with ❤ by GitHub

Web に配置したとき、パーサーエラーと表示される

「パーサー エラー メッセージ: 型 '○○○’ を読み込めませんでした。」と表示される場合、aspx ファイルの CodeBehindCodeFile に変更します。


<%@ Page Language="vb" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="GeneratorWebForm" %>

view raw

gistfile1.asp

hosted with ❤ by GitHub