ニコカレ微妙にバージョンアップ開始

時間に余裕ができたり、小ネタを思いついたのでニコカレのバージョンアップをはじめてみたり(・∀・)


新機能を実装するための前準備として、画像ファイルを動的に生成するように修正。
今まではEmotion*5パターンと、コメント有無、リンク有無の組み合わせ20パターンのアイコンを事前に用意するというベタな事をやっていたんですが(´Д`;)
今回からはパラメータを元にサーバ側で動的にイメージを合成して、PNG形式で返す様に変更しまスタ。
あと、毎回イメージを生成するのもアホな子なので、Cacheを使用。


最初、イメージは透過GIFで生成しようかと思っていたんですが、面倒な気がしてきたのでとりあえず止め(´Д`)
もし透過GIFを作成する場合、PixelFormat.Format8bppIndexedなBitmapが必要になるわけですが。
でも、PixelFormat.Format8bppIndexedなBitmapからGraphics.FromImage()でGraphicsは取得できないので、ビットを直接操作してイメージを変更してやる必要が出てくるわけで。


こういうのネ。

// 例)
// imageのピクセルの色がclrTransparentな所を透過にしたBitmapを作る処理
public static Bitmap GetTransparentImage(Bitmap image, Color clrTransparent)
{
    Bitmap dst = new Bitmap( image.Width, image.Height, PixelFormat.Format32bppArgb );

    BitmapData dst = dst.LockBits( new Rectangle( 0, 0, dst.Width, dst.Height ),
                                   ImageLockMode.WriteOnly, dst.PixelFormat );

    unsafe
    {
        for( int y = 0; y < image.Height; y++ )
        {
            bits* row = (bits*)dst.Scan0 + ( dst.Stride * y );
            for( int x = 0; x < image.Width; x++ )
            {
                Color clr = image.GetPixel( x, y );

                int xref = x * 4;

                row[ xref + 0 ] = clr.B;
                row[ xref + 1 ] = clr.G;
                row[ xref + 2 ] = clr.R;

                if ( clr == clrTransparent )
                    row[ xref + 3 ] = 0;
                else
                    row[ xref + 3 ] = 255;
            }
        }
    }

    dst.UnlockBits( dst );

    return dst;
}

まあ、ビット操作をやるくらいは良いかと思っていたんですが。
でも、フルカラーから256色に減色する際に、最適なColorPaletteを作るための減色アルゴリズムが必要だと気がつき、どうすれば良いのかしら?、っということで悩み。
それ以前に、合成する前のイメージがAlpha値を持っていた場合に、合成後のAlpha値はどうしたものか…ということで、とりあえず、背景色まで指定したイメージを作る方法でお茶を濁すことにしました(´Д`)


で、任意のイメージが作れるようになったので、前はテキストとして表示していた「残業時間」もイメージの中に描画するように修正。*1
そして、スペースの空いた「残業時間欄」に、新機能を追加する予定だったり(・∀・)

*1:みんな、あんまり残業時間は入力しないし(´Д`;)