DOBON.NET DOBON.NETプログラミング掲示板過去ログ

画像をアイコンとして保存

環境/言語:[Windows 7、Visual Studio 2010]
分類:[.NET]

こんにちは。いつもお世話になっています。

果たしてVB.NETでPNGの画像を32ビット色のIcon(.ico)として簡単に保存することはできるでしょうか?dobon.netさんでもここ(http://dobon.net/vb/dotnet/graphics/saveimage.html)で画像をアイコンとして保存する説明をしています。これは確かに簡単な方法です。ただ書かれてある通り、アイコンの色が16色になってしまいますね。ImageMagickNETというものも試してみましたが、これはまだ未熟なものでちょっとまだ使えそうにはなさそうです。(他のframeworkと競合してしまう。)またiconmaker(http://www.inedo.com/downloads/icon-maker)という#Cで書かれたものをVB.NETに変換して見てみましたが、データ・タイプでvarなんかが使われていて、ちょっと自分ではこのコードをどうVB.NETで使えるかよくわかりません。まあ、あとはImageMagickを経由するという方法も試してみましたが、これだと使う側でImageMagickがインストールされていないと自分のアプリケーション自体を起動できなくなる、ということにもなってしまいますね。

何か良い提案がありましたら宜しくお願いします。
■No31080に返信(洗剤野郎さんの記事)
> 果たしてVB.NETでPNGの画像を32ビット色のIcon(.ico)として
> 簡単に保存することはできるでしょうか?

一括変換する機能は、.NET にも API にも無かったように思います。

バイナリファイルとして、ヘッダやデータ領域を自前で記載してみてください。
http://www14.ocn.ne.jp/~setsuki/ext/ico.htm
http://wawatete.ddo.jp/exec/program/cs/icon_32bit
http://msdn.microsoft.com/en-us/library/ms997538.aspx
http://msdn.microsoft.com/ja-jp/library/aa511280.aspx


> という#Cで書かれたもの
C# ですね、#C ではなく。


> データ・タイプでvarなんかが使われていて、
そのまま Dim に置き換えてください。As 句を省略するだけで OK です。

「int a = 123;」は「Dim a As Integer = 123」で、
「var a = 123;」は「Dim a = 123」です。(要VB2008以上)
回答になっていないのですが…

C#だとやっている方がいるようですね。
こちらの方はIconMakerを通してやっているようで、
pngから要素を抽出して32bitに割り当ててる感じです。
varとかは使ってないので、VB化できますでしょうか?

http://wawatete.ddo.jp/exec/program/cs/icon_32bit

あと、じゃんぬさんがお答えしているかなり古い内容なら見つかりましたが、
こちらはhIconからのico出力になるので、微妙かもしれませんし、
掲載するのはやめておきます…。
■No31081に返信(魔界の仮面弁士さんの記事)
> ■No31080に返信(洗剤野郎さんの記事)
>>果たしてVB.NETでPNGの画像を32ビット色のIcon(.ico)として
>>簡単に保存することはできるでしょうか?
>
> 一括変換する機能は、.NET にも API にも無かったように思います。
>
> バイナリファイルとして、ヘッダやデータ領域を自前で記載してみてください。
> http://www14.ocn.ne.jp/~setsuki/ext/ico.htm
> http://wawatete.ddo.jp/exec/program/cs/icon_32bit
> http://msdn.microsoft.com/en-us/library/ms997538.aspx
> http://msdn.microsoft.com/ja-jp/library/aa511280.aspx
>
>
>>という#Cで書かれたもの
> C# ですね、#C ではなく。
>
>
>>データ・タイプでvarなんかが使われていて、
> そのまま Dim に置き換えてください。As 句を省略するだけで OK です。
>
> 「int a = 123;」は「Dim a As Integer = 123」で、
> 「var a = 123;」は「Dim a = 123」です。(要VB2008以上)


魔界の仮面弁士さん、howlingさん、早速の提案をありがとうございます。確かにいつもOption Explicitでコードを書いているので、必要があればこれを使わずにもう一度#CのコードVB.NETに変換してみようと思います。またhowlingさんが提案してくれたウェブサイトはまだ見たことがありませんでした。早速詳しく吟味してみます。
■No31083に返信(洗剤野郎さんの記事)
> ■No31081に返信(魔界の仮面弁士さんの記事)
>>■No31080に返信(洗剤野郎さんの記事)
> >>果たしてVB.NETでPNGの画像を32ビット色のIcon(.ico)として
> >>簡単に保存することはできるでしょうか?
>>
>>一括変換する機能は、.NET にも API にも無かったように思います。
>>
>>バイナリファイルとして、ヘッダやデータ領域を自前で記載してみてください。
>>http://www14.ocn.ne.jp/~setsuki/ext/ico.htm
>>http://wawatete.ddo.jp/exec/program/cs/icon_32bit
>>http://msdn.microsoft.com/en-us/library/ms997538.aspx
>>http://msdn.microsoft.com/ja-jp/library/aa511280.aspx
>>
>>
> >>という#Cで書かれたもの
>>C# ですね、#C ではなく。
>>
>>
> >>データ・タイプでvarなんかが使われていて、
>>そのまま Dim に置き換えてください。As 句を省略するだけで OK です。
>>
>>「int a = 123;」は「Dim a As Integer = 123」で、
>>「var a = 123;」は「Dim a = 123」です。(要VB2008以上)
>
>
> 魔界の仮面弁士さん、howlingさん、早速の提案をありがとうございます。確かにいつもOption Explicitでコードを書いているので、必要があればこれを使わずにもう一度#CのコードVB.NETに変換してみようと思います。またhowlingさんが提案してくれたウェブサイトはまだ見たことがありませんでした。早速詳しく吟味してみます。

失礼。#Cでしたね。
■No31083に返信(洗剤野郎さんの記事)
>>「int a = 123;」は「Dim a As Integer = 123」で、
>>「var a = 123;」は「Dim a = 123」です。(要VB2008以上)
> いつもOption Explicitでコードを書いているので、必要があればこれを使わずに

『Option Explicit』は「変数宣言そのものを省略できるか否か」の制御ですね。
デフォルトは On のはずですが、あえて Off にしているということでしょうか?


一方、As の省略は「ローカル型の推論」と呼ばれており、
こちらは『Option Infer』で制御されるようになっています。

Option Infer Off に変更した場合は、VB2005 以下と同様の動きになるため、
先の様に「Dim a = 123」という宣言があったとすれば、コンパイル時には
 Option Strict Off なら「Dim a As Object = 123」
 Option Strict On ならコンパイルエラー BC30209(As句が必要です)
として処理されます。


> もう一度#Cのコード
> 失礼。#Cでしたね。
もしかして間違えて覚えてしまっている? (typo にしてはミスが多すぎるので)
> もしかして間違えて覚えてしまっている? (typo にしてはミスが多すぎるので)

おっしゃる通りで恥ずかしいです。

howlingさんが提案してくれたhttp://wawatete.ddo.jp/exec/program/cs/icon_32bitにあるC#のコードをVB.NETに変換を試みましたが、残念ながらうまくいきませんね。結構時間をかけて確認したものの、果たして何が悪いのか。。。ファイルを保存するとアイコン・ファイルが0サイズになってしまいます。一方、C#のプロジェクトをDebuggerでテスト・ランするとPNGをアイコン・ファイルとして保存できます。ただ残念なことにアイコンの大きさが256 x 256ではなく128 x 128ピクセルになっていまうようですね。

DOBON.NET | プログラミング道 | プログラミング掲示板