4

ビットマップをアイコンに変換しようとしていて、ビットマップのパレットを設定する必要があります ( GetHicon from a 16 COLOR bitmap returns an image with less colors を参照)。そのために、私はこの答えに従おうとしています:しかし、パレットが空であることがわかり、元の配列を変更する必要があるため、新しい配列を作成できません。(とにかく試してみましたが、うまくいきません。)

私は持っている:

ColorPalette palette = bitmap.Palette;
Color[] entries = palette.Entries;

しかし、entriesの長さはゼロです。

では、ColorPalette を変更するにはどうすればよいでしょうか。

4

1 に答える 1

5

前述のように、ビットマップ ファイルに必ずしもパレットがあるとは限りません。実際、256 色を超える最新のカラー ファイルでは、パレットを使用する可能性はほとんどありません (ただし、使用できると思います)。代わりに、色情報は (パレット テーブルを指すのではなく) ピクセル値自体から得られます。

( http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/4a10d440-707f-48d7-865b-1d8804faf649/ )から次のコードを見つけました。私はそれをテストしていません(著者は「VS 2008 c#で.net 3.5でテスト済み」と述べていますが)。

色数の縮小を自動的に処理するようです...

[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static bool DestroyIcon(IntPtr handle);

private void buttonConvert2Ico_Click(object sender, EventArgs e)
{
    OpenFileDialog openFileDialog1 = new OpenFileDialog

    openFileDialog1.InitialDirectory = "C:\\Data\\\" ;
    openFileDialog1.Filter = "BitMap(*.bmp)|*.bmp" ;
    openFileDialog1.FilterIndex = 2 ;
    openFileDialog1.RestoreDirectory = true ;

    if(openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        try
        {
            string sFn = openFileDialog1.FileName;
            MessageBox.Show("Filename=" + sFn);
            string destFileName = sFn.Substring(0, sFn.Length -3) +"ico";

            // Create a Bitmap object from an image file.
            Bitmap bmp = new Bitmap(sFn);
            // Get an Hicon for myBitmap. 
            IntPtr Hicon = bmp.GetHicon();
            // Create a new icon from the handle. 
            Icon newIcon = Icon.FromHandle(Hicon);
            //Write Icon to File Stream
            System.IO.FileStream fs = new System.IO.FileStream(destFileName, System.IO.FileMode.OpenOrCreate);
            newIcon.Save(fs);
            fs.Close();
            DestroyIcon(Hicon);
            setStatus("Created icon From=" + sFn + ", into " + destFileName);
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: Could not read/write file. Original error: " + ex.Message);
        }
    }
}
于 2012-12-17T19:53:24.283 に答える