いくつかの異なるサイズ(16px、32px、64px)のアイコンがあります。 ToBitmap()
を呼び出していますが、常に32pxの画像が返されます。 64pxのものを取得するにはどうすればよいですか?
これは、ResourceManagerクラスのかなり厄介な制限です。そのGetObject()メソッドは、返されたアイコンをサイズで選択できるようにする追加の引数を渡す方法を提供していません。回避策は、代わりにアイコンをプロジェクトに追加することです。プロジェクト+既存のアイテムの追加を使用して、.icoファイルを選択します。追加したアイコンを選択し、BuildActionプロパティを「EmbeddedResource」に変更します。
これで、次のようなコードで目的のアイコンを取得できます。
public static Icon GetIconFromEmbeddedResource(string name, Size size) {
var asm = System.Reflection.Assembly.GetExecutingAssembly();
var rnames = asm.GetManifestResourceNames();
var tofind = "." + name + ".ICO";
foreach (string rname in rnames) {
if (rname.EndsWith(tofind, StringComparison.CurrentCultureIgnoreCase)) {
using (var stream = asm.GetManifestResourceStream(rname)) {
return new Icon(stream, size);
}
}
}
throw new ArgumentException("Icon not found");
}
使用例:
var icon1 = GetIconFromEmbeddedResource("ARW04LT", new Size(16, 16));
var icon2 = GetIconFromEmbeddedResource("ARW04LT", new Size(32, 32));
考えられる障害モードの1つに注意してください。このコードは、アイコンがメソッドを含む同じアセンブリに追加されたことを前提としています。
これは役に立ちますか?
Icon sizedIcon = new Icon(Resources.ResourceIcon, new Size(64,64));
同じ問題に遭遇した他の人のために、私は素敵な小さな解決策を見つけました。
Image img = new Icon(Properties.Resources.myIcon, width, height).ToBitmap()
以下は、ツールバーのすべてのボタンのアイコンサイズを設定します。
ボタンタグに格納されているリソース名に依存します。
public void SetButtons(object toolstrip, int IconWidth, int IconHeight)
{
var ts = (ToolStrip) toolstrip;
var size = new System.Drawing.Size();
size.Height = IconSize;
size.Width = IconSize;
foreach (ToolStripButton tsBtn in ts.Items)
{
tsBtn.ImageScaling = ToolStripItemImageScaling.None;
var resourcename = (String) tsBtn.Tag;
if (resourcename != null)
{
var myIcon = (Icon) Properties.Resources.ResourceManager.GetObject(resourcename);
var newIcon = new Icon(myIcon, IconWidth, IconHeight);
tsBtn.Image = newIcon.ToBitmap();
}
}
}
internal static class IconHelper {
public static Icon GetSize(this Icon icon, int width, int height) {
return icon.GetSize(new Size(width, height));
}
public static Icon GetSize(this Icon icon, Size size) {
using(var mem = new MemoryStream()) {
icon.Save(mem);
mem.Position = 0;
return new Icon(mem, size);
}
}
}
これを行う.Netフレームワークには組み込みメソッドはありません。
代わりに、 このライブラリ を使用できます。
サイズは最初にIcon
インスタンスを作成するときに決定されるため、 Icon
コンストラクター のいずれかを使用して、作成時に使用するサイズを指定する必要があります。 = Size
パラメータを取ります。