2006年02月17日

品質度外視のテストコード

お久しぶりです。なかなか書くネタが無くてとぎれがち。

今回はきっちりした記事ではありませんが、普段テストコード書くときはこんな風、というのを無意味に晒してみようという趣旨です。

ネタ元は透過GIFのリサイズというスレッド。残念なことに力及ばず質問者の方を困惑させてしまっただけになってしまい大変申し訳ないのですが。

その課程で使用したテスト用のコードがまあ確かにそれなりの長さになったので、そのまま破棄するのももったいないかと思ってここで再利用というわけです。

ほぼ無修正なので全く読みやすくはありませんしコメントももちろん不十分、途中でこの中には含まれないクラスやらメソッドやらが出てきたりと、参考にもしがたいものですが、まあ公開を意識しなければこんなコードだよ、と言うところです。

ちなみにここから公開用に清書しようと思ったら多分何時間単位だと思います。

namespace HongliangSoft.Test {
  public class Entry {
    private static Color FindTransparentColor(string file) {
      using (FileStream fs = new FileStream(file, FileMode.Open)) {
        BinaryReader reader = new BinaryReader(fs);
        reader.ReadBytes(10);
        byte data = reader.ReadByte();
        //最上位ビットが0ならグローバルカラーテーブルがない
        if ((data & 0x80) == 0) {
          w("cant find global color table");
          return Color.Transparent;
        }
        //5-7ビットが色深度
        int depth = (data << 1) >> 5;
        //1-3ビットがグローバルカラーテーブルのサイズを表す2を底とする(指数-1)
        int size = 1 << ((data & 0x7) + 1);
        reader.ReadBytes(2);
        //グローバルカラーテーブル読み込み
        byte[] table = reader.ReadBytes(size * 3);
        //カラーテーブルの次のデータを読み込む
        byte[] block = reader.ReadBytes(3);
        if (block[0] == 0x21 && block[1] == 0xF9 && block[2] == 0x4) {
          byte param = reader.ReadByte();
          if ((param & 1) == 0) {
            w("transparent color is not supported.");
            return Color.Transparent;
          }
          reader.ReadBytes(2);
          byte transparentIndex = reader.ReadByte();
          MemoryStream ms = new MemoryStream();
          reader.ReadBytes(1 + 5 + 4 + 1);
          int blockSize = reader.ReadByte();
          int read;
          do {
            read = reader.ReadByte();
            byte[] buf = reader.ReadBytes(read);
            ms.Write(buf, 0, buf.Length);
          } while (read == 0xFF);
          ms.Position = 0;
          //TranslateLZW(ms, blockSize);
          int index = transparentIndex * 3;
          return Color.FromArgb(table[index], table[index + 1], table[index + 2]);
        }
        w("block header is iligal.", BtoS(block));
        return Color.Transparent;
      }
    }
    static void MakeGif() {
      int blc = 0;
      for (int blc = 8; blc < 25; blc++) {
        using (FileStream fs = new FileStream(string.Format("make{0:d2}.gif", blc),
                               eMode.OpenOrCreate)) {
          BinaryWriter bw = new BinaryWriter(fs);
          //ヘッダ
          bw.Write(new byte[]{0x47, 0x49, 0x46, 0x38, 0x39, 0x61});
          //サイズ縦横、フラグ、ゼロ2
          bw.Write(new byte[]{0x80, 0x00, 0x80, 0x00, 0xF7, 0x00, 0x00});
          //グローバルカラーテーブル 黒
          bw.Write(new byte[]{0x00, 0x00, 0x00});
          //グローバルカラーテーブル 白
          bw.Write(new byte[]{0xFF, 0xFF, 0xFF});
          //グローバルカラーテーブル 赤
          bw.Write(new byte[]{0xFF, 0x00, 0x00});
          //グローバルカラーテーブル 青
          bw.Write(new byte[]{0x00, 0x00, 0xFF});
          //グローバルカラーテーブル 緑
          bw.Write(new byte[]{0x00, 0xFF, 0x00});
          //グローバルカラーテーブルのこり
          for (int i = 5; i < 256; i++)
            bw.Write(new byte[3]);
          //拡張色情報 ヘッダ3 透明色有効 ゼロ2 透明色インデクス 終端
          bw.Write(new byte[]{0x21, 0xF9, 0x04, 0x01, 0x00, 0x00, 0x02, 0x00});
          //イメージブロック開始 開始記号 左端2 上端2 幅2 縦2 ローカルテーブルなし
          bw.Write(new byte[]{0x2C, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00});
          bw.Write(new byte[]{0x00});
          //以上でヘッダ部分終了。以下イメージデータ。
          MemoryStream lzwed = new MemoryStream();
          HongliangSoft.Utilities.LZW lzw = new HongliangSoft.Utilities.LZW(8);//blc);
          lzw.Encode(lzwed, GetDrawData());
          lzwed.Position = 0;
          BinaryReader reader = new BinaryReader(lzwed);
          int lastLen = (int)lzwed.Length;
          do {
            byte writeLen = (lastLen > 255) ? (byte)255 : (byte)lastLen;
            bw.Write(new byte[]{writeLen});
            bw.Write(reader.ReadBytes(writeLen));
          } while ((lastLen -= 255) > 0);
          bw.Write(new byte[]{0x00, 0x3B});
        }
      }
    }
    unsafe private static byte[] GetDrawData() {
      Size bmp = new Size(128, 128);
      int wid = bmp.Width, hei = bmp.Height;
      int wid2 = wid / 2, hei2 = hei / 2;
      int wid4 = wid2 / 2, hei4 = hei2 / 2;
      int wid3 = wid4 * 3, hei3 = wid4 * 3;
      byte red = 2, blue = 3, green = 4;//, black = 0;
      byte trans = 16;
      byte[] data = new byte[128 * 128];
      fixed (byte* pptr = data) {
        byte* ptr = pptr;
        int y = 0;
        for (; y < hei4; y++) {
          int x = 0;
          for (; x < wid4; x++)
            *(ptr++) = green;
          for (; x < wid3; x++)
            *(ptr++) = trans;
          for (; x < wid; x++)
            *(ptr++) = green;
        }
        for (; y < hei3; y++) {
          for (int x = 0; x < wid; x++)
            *(ptr++) = blue;
        }
        for (; y < hei; y++) {
          int x = 0;
          for (; x < wid4; x++)
            *(ptr++) = green;
          for (; x < wid3; x++)
            *(ptr++) = red;
          for (; x < wid; x++)
            *(ptr++) = green;
        }
      }
      return data;
    }
    [STAThread] unsafe public static void Main(string[] args) {
      Form f;
      Bitmap bmp;

      bmp = new Bitmap(128, 128, PixelFormat.Format8bppIndexed);
      ColorPalette palette = bmp.Palette;
      palette.Entries[0] = Color.Black;
      palette.Entries[1] = Color.White;
      palette.Entries[2] = Color.Red;
      palette.Entries[3] = Color.Blue;
      palette.Entries[4] = Color.FromArgb(0, 255, 0);
      for (int i = 5; i < palette.Entries.Length; i++)
        palette.Entries[i] = Color.Pink;
      BitmapData data = LockBits(bmp);
      unsafe {
        int wid = bmp.Width, hei = bmp.Height;
        int wid2 = wid / 2, hei2 = hei / 2;
        int wid4 = wid2 / 2, hei4 = hei2 / 2;
        int wid3 = wid4 * 3, hei3 = wid4 * 3;
        byte red = 2, blue = 3, green = 4;//, black = 0;
        byte trans = 16;
        byte* ptr = (byte*)data.Scan0.ToPointer();
        int y = 0;
        for (; y < hei4; y++) {
          int x = 0;
          for (; x < wid4; x++)
            *(ptr++) = green;
          for (; x < wid3; x++)
            *(ptr++) = trans;
          for (; x < wid; x++)
            *(ptr++) = green;
        }
        for (; y < hei3; y++) {
          for (int x = 0; x < wid; x++)
            *(ptr++) = blue;
        }
        for (; y < hei; y++) {
          int x = 0;
          for (; x < wid4; x++)
            *(ptr++) = green;
          for (; x < wid3; x++)
            *(ptr++) = red;
          for (; x < wid; x++)
            *(ptr++) = green;
        }
      }
      bmp.UnlockBits(data);
      bmp.Palette = palette;
      //bmp.Save("testori.gif", ImageFormat.Gif);
      w(bmp.PixelFormat);
      bmp.MakeTransparent(Color.Red);
      w(bmp.PixelFormat);
      //bmp.Save("testtra.gif", ImageFormat.Gif);
      f = new F(bmp);
      f.BackColor = Color.Yellow;
      Application.Run(f);
      Exit();

      /*
    bmp = new Bitmap(128, 128, PixelFormat.Format32bppArgb);
    using (Graphics g = Graphics.FromImage(bmp)) {
      g.Clear(Color.FromArgb(0, 255, 0));
      g.CompositingMode = CompositingMode.SourceOver;
      int width = bmp.Width, height = bmp.Height;
      int width2 = width / 2, height2 = height / 2;
      int width4 = width / 4, height4 = height / 4;
      using (Brush b = new SolidBrush(Color.Red))
        g.FillRectangle(b, width4, 0, width2, bmp.Height);
      using (Brush b = new SolidBrush(Color.Blue))
        g.FillRectangle(b, 0, height4, width, height2);
      using (Brush b = new SolidBrush(Color.Black))
        g.FillEllipse(b, width4, height4, width2, height2);
      bmp.MakeTransparent(Color.Red);
    }
       */

      bmp.Save("gif.gif", ImageFormat.Gif);
      f = new F(bmp);
      f.BackColor = Color.Yellow;
      Application.Run(f);

      Color transp = FindTransparentColor("gifggg.gif");
      w(transp);
      bmp = new Bitmap("gifggg.gif");
      w(bmp.PixelFormat);
      SearchBmp(bmp);
      Exit();
      //bmp.MakeTransparent(transp);
      //bmp.MakeTransparent(Color.FromArgb(0, 0, 0, 0));

      f = new F(bmp);
      f.BackColor = Color.Yellow;
      Application.Run(f);
      Exit();

      {
        int wid = bmp.Width * 2, hei = bmp.Height * 2;
        Bitmap copy = new Bitmap(wid, hei, PixelFormat.Format24bppRgb);
        using (Graphics g = Graphics.FromImage(copy)) {
          g.DrawImage(bmp, 0, 0, wid, hei);
        }
        //copy.MakeTransparent(Color.FromArgb(0, 0, 0, 0));
        //copy.MakeTransparent(transp);
        w(copy.GetPixel(copy.Width / 2, copy.Height - 10));
        copy.SetPixel(copy.Width / 2, copy.Height - 10, Color.Black);
        f = new F(copy);
        f.BackColor = Color.Yellow;
        Application.Run(f);
        Exit();
        //copy.MakeTransparent(transp);
        copy.Save("gif2.gif", ImageFormat.Gif);
        Color transp2;
        w(transp2 = FindTransparentColor("gif2.gif"));
        bmp = new Bitmap("gif2.gif");
        bmp.MakeTransparent(transp2);
        f = new F(bmp);
        f.BackColor = Color.Yellow;
        Application.Run(f);
        bmp = new Bitmap("gif2.gif");
        bmp.MakeTransparent(transp);
        f = new F(bmp);
        f.BackColor = Color.Yellow;
        Application.Run(f);
        Exit();
      }
      bmp = new Bitmap("gif.gif");
      bmp.MakeTransparent(Color.FromArgb(0, 0, 0, 0));
      f = new F(bmp);
      f.BackColor = Color.Yellow;
      Application.Run(f);
/*
      Bitmap bmp = new Bitmap(128, 128, PixelFormat.Format32bppArgb);
      using (Graphics g = Graphics.FromImage(bmp)) {
        g.Clear(Color.FromArgb(0, 255, 0));
        g.CompositingMode = CompositingMode.SourceOver;
        int width = bmp.Width, height = bmp.Height;
        int width4 = width / 4, height4 = height / 4;
        using (Brush b = new SolidBrush(Color.Red))
          g.FillRectangle(b, width4, 0, width4 * 2, bmp.Height);
        using (Brush b = new SolidBrush(Color.Blue))
          g.FillRectangle(b, 0, height4, width, height4 * 2);
        bmp.MakeTransparent(Color.Red);
      }
      bmp.Save("gif.gif", ImageFormat.Gif);
      bmp = new Bitmap("gif.gif");

      Bitmap bmp = new Bitmap("touka.gif");
      //bmp.MakeTransparent(Color.FromArgb(0, 0, 0, 0));
      w(bmp.PixelFormat);
      bmp.MakeTransparent();
      bmp.Save("touko.gif", ImageFormat.Gif);
      bmp = new Bitmap("touko.gif");
      Bitmap bmp = new Bitmap("gif.gif");
      bmp.MakeTransparent(Color.FromArgb(0, 0, 0, 0));
      w(bmp.PixelFormat);
      Form f = new F(bmp);
      f.BackColor = Color.White;
      Application.Run(f);
*/
    }
  }
}
posted by Hongliang at 08:32| Comment(0) | TrackBack(0) | C# | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/13377058

この記事へのトラックバック

ここ(hongliang.seesaa.net)で公開しているものについて、利用は自由に行って頂いて構いません。改変、再頒布もお好きになさって下さい。利用に対しこちらが何かを要求することはありません。

ただし、公開するものを使用、または参考したことによって何らかの損害等が生じた場合でも、私はいかなる責任も負いません。

あ、こんなのに使ったってコメントを頂ければ嬉しいです。

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。