トップ 最新 追記

parkの雑記帳

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|
2009|03|04|05|08|09|11|12|

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

結果はこの通り。

Tween PictureBox Diff

手法がすごく汚いとは自覚してます。本当は 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) を参照ボタンから追加してやらないといけないらしい。