parkの雑記帳
2009-11-01 [Sun]
・ [プログラミング] Tween改造
最近Twitterのサーバで画像を縮小してくれなくなりました。そのためアップロードされた画像のサイズそのままを取得することになってしまいます。
そこで問題になるのが縮小の際のリサイズの処理です。
Tweenでは System.Windows.Forms.PictureBox にそのまま任せているのですが、PictureBox のデフォルトの処理が画質重視ではなく、そのため画像によってはジャギーが出てしまいます。
そこで、以下のようなコード断片を Tween.vb に追加し、UserPicture コントロールの Paint イベントのハンドラとして追加しました。
Private Sub UserPicture_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles UserPicture.Paint
If e.Graphics.InterpolationMode <> Drawing2D.InterpolationMode.HighQualityBicubic Then
e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
UserPicture.GetType().GetMethod("OnPaint", BindingFlags.NonPublic Or BindingFlags.Instance).Invoke(UserPicture, New Object() {e})
End If
End Sub
結果はこの通り。

手法がすごく汚いとは自覚してます。本当は PictureBox のサブクラスを作って OnPaint メソッドを override するべきなんでしょうが。
・ [プログラミング] Tween改造のちゃんとしたやりかた
ユーザーコントロール作ったときに既存クラスのサブクラスであればスーパークラスの属性とかをそのままフォームエディタで使えたということに今更気付いた。
ということで、PictureBox を継承したやつを作ってユーザーコントロールとして追加してやればいいようで。
public partial class MyPictureBox : PictureBox
{
public MyPictureBox()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs pe)
{
pe.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
base.OnPaint(pe);
}
}
こんな感じで。
ユーザーコントロールをフォームエディタで使うときには、コントロールを選ぶツールボックスの所で右クリックして「アイテムの追加」から探すんだけれど、このときにコントロールの入ったアセンブリ (.dll, .exe) を参照ボタンから追加してやらないといけないらしい。
[ツッコミを入れる]