5

Googleでこれについて多くの時間を費やした後、C#でWbmpイメージをPng形式に変換する例に出くわすことができませんでした.インターネットからいくつかのWbmpイメージをダウンロードし、バイナリエディタを使用してそれらを表示しています.

そうするのに役立つアルゴリズムを持っている人はいますか、それともコードも役立ちます。

私がこれまでに知っていること:

  1. 最初のバイトは type* (モノクロ画像の場合は 0)
  2. 2番目のバイトは「固定ヘッダー」と呼ばれ、0です
  3. 3 バイト目は画像の幅 (ピクセル単位)*
  4. 4 番目のバイトは、ピクセル単位の画像の高さです*
  5. 行に配置されたデータ バイト - ピクセルあたり 1 ビット: 行の長さが 8 で割り切れない場合、行はバイト境界まで 0 で埋められます。

私は完全に迷っているので、助けていただければ幸いです


他のコードの一部:

using System.Drawing;
using System.IO;

class GetPixel
{
   public static void Main(string[] args)
   {
      foreach ( string s in args )
      {
         if (File.Exists(s))
         {
            var image = new Bitmap(s);
            Color p = image.GetPixel(0, 0);
            System.Console.WriteLine("R: {0} G: {1} B: {2}", p.R, p.G, p.B);
         }
      }
   }
}

class ConfigChecker
{
   public static void Main()
   {
      string drink = "Nothing";
      try
      {
         System.Configuration.AppSettingsReader configurationAppSettings 
            = new System.Configuration.AppSettingsReader();
         drink = ((string)(configurationAppSettings.GetValue("Drink", typeof(string))));
      }
      catch ( System.Exception )
      {
      }
      System.Console.WriteLine("Drink: " + drink);
   } // Main
} // class ConfigChecker

プロセス :

  1. Wbmpについて調査しました

  2. 最初に X.wbmp を開いて詳細を確認します

  3. WBMP ファイルの幅と高さを確認する方法を調べます (後でコードを記述できるようにします)。長さバイトのコレクションを変換する最も簡単な方法 (MSB がクリアされた後) は、エンティティを base-128 として扱うことであることに注意してください。

  4. 私が更新したサンプルコードを見てください。

  5. 空の Bitmap オブジェクトを作成し、その幅と高さを (3) で計算した値に設定しようとしています。

  6. データのすべてのビットに対して、作成された Bitmap オブジェクトで SetPixel を実行しようとします。

  7. WBMP 幅が 8 の倍数でない場合は、0 をパディングします。

  8. Save() メソッドを使用してビットマップを保存します。

アプリの使用例。アプリケーションは Wbmp2Png と呼ばれるものとします。コマンドラインで:

Wbmp2Png IMG_0001.wbmp IMG_0002.wbmp IMG_0003.wbmp

アプリケーションは、IMG_0001.wbmp、IMG_0002.wbmp、および IMG_0003.wbmp のそれぞれを PNG ファイルに変換します。

4

2 に答える 2

3

このコードを試してください、これはうまくいきます!

using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

class WBmpConvertor
{
   public void Convert(string inputFile, string outputFile, ImageFormat format)
    {
        byte[] datas = File.ReadAllBytes(inputFile);
        byte tmp;
        int width = 0, height = 0, offset = 2;
        do
        {
            tmp = datas[offset++];
            width = (width << 7) | (tmp & 0x7f);
        } while ((tmp & 0x80) != 0);
        do
        {
            tmp = datas[offset++];
            height = (height << 7) | (tmp & 0x7f);
        } while ((tmp & 0x80) != 0);

        var bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
        BitmapData bd = bmp.LockBits(new Rectangle(0, 0, width, height),
                                     ImageLockMode.WriteOnly, bmp.PixelFormat);
        int stride = (width + 7) >> 3;
        var tmpdata = new byte[height * width];
        for (int i = 0; i < height; i++)
        {
            int pos = stride * i;
            byte mask = 0x80;
            for (int j = 0; j < width; j++)
            {
                if ((datas[offset + pos] & mask) == 0)
                    tmpdata[i * width + j] = 0;
                else
                    tmpdata[i * width + j] = 0xff;
                mask >>= 1;
                if (mask == 0)
                {
                    mask = 0x80;
                    pos++;
                }
            }
        }
        Marshal.Copy(tmpdata, 0, bd.Scan0, tmpdata.Length);

        bmp.UnlockBits(bd);
        bmp.Save(outputFile, format);
    }
}
于 2012-08-13T03:41:20.140 に答える
3

これで仕事が捗りそうです。

using System.Drawing;
using System.IO;

namespace wbmp2png
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (string file in args)
            {
                if (!File.Exists(file))
                {
                    continue;
                }
                byte[] data = File.ReadAllBytes(file);
                int width = 0;
                int height = 0;
                int i = 2;
                for (; data[i] >> 7 == 1; i++)
                {
                    width = (width << 7) | (data[i] & 0x7F);
                }
                width = (width << 7) | (data[i++] & 0x7F);
                for (; data[i] >> 7 == 1; i++)
                {
                    height = (height << 7) | (data[i] & 0x7F);
                }
                height = (height << 7) | (data[i++] & 0x7F);
                int firstPixel = i;
                Bitmap png = new Bitmap(width, height);
                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        png.SetPixel(x, y, (((data[firstPixel + (x / 8) + (y * ((width - 1) / 8 + 1))] >> (7 - (x % 8))) & 1) == 1) ? Color.White : Color.Black);
                    }
                }
                png.Save(Path.ChangeExtension(file, "png"));
            }
        }
    }
}
于 2012-08-17T13:47:03.220 に答える