2

写真のリストを表示するための配列を取得しようとしていPictureBoxます(pngファイル形式)。

.NET コントロールを使用しようとしましたImageListが、画像のサイズ変更を要求されます。また、これらの png ファイルの透明な背景もサポートしていません。

Assemblyまた、次のように を使用してファイルを取得しようとしまし
_imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.png"); たが、コードはリソース ファイルを返さず、実行時エラーもスローしません。

私の質問は、これを行う他の方法はありますか? またはさらに良いことに、どうにかしてImageList自分の写真を変更しないように制御できますか? ありがとう。

4

2 に答える 2

0

これが最高かどうかはわかりませんが、このようなことを試すことができます:-

 Assembly ambly = Assembly.LoadFile(pathToDll);

また

 BitMap bitMap;
 // where "ns" is the default namespace of the resource project    
 using (Stream resourceStream = ambly.GetManifestResourceSream("ns.image.jpg"))
 {
  bitMap = BitMap.FromStream(resourceStream);
 }

例:-

 interface IThemeResourceProvider
 {
 Stream LoadBigLogo();
 Stream LoadSmallLogo();
 } 

次に、そのインターフェイスをリソースライブラリに実装します

 public class ThemeResourceProvider : IThemeResourceProvider
 {
 public Stream LoadBigLogo()
 {
     Assembly ambly = Assembly.GetExecutingAssembly();
     return ambly.GetManifestResourceStream("namespace.image.jpg");
  }

  (...)
  }

最後に、リソースをメインアプリケーションに直接ロードする代わりに、リソースライブラリにあるIThemeResourceProviderをインスタンス化します。

    Assembly assembly = Assembly.LoadFile(pathToDll);

   var results = from type in assembly.GetTypes()
           where typeof(IThemeResourceProvider).IsAssignableFrom(type)
           select type;

これで、そのリストにIEnumerableができました。通常は1つしかありませんが、このアプローチを使用すると、複数のリソースセットをホストし、同じリソースdllに複数のIThemeResourceProviderを実装することもできます。たとえば、各IThemeResourceProviderを、プロパティとして、またはさまざまな実装でカスタム[属性]装飾を使用して、名前で識別することができます。残りはあなたに任せます。

ただし、リスト内のIThemeResourceProvidersをインスタンス化する方法は次のとおりです。

    foreach (var providerType in results)
   {
  var constructorInfo = providerType.GetConstructor(Type.EmptyTypes);
  IThemeResourceProvider provider = constructorInfo.Invoke(null);
   }

そして最後に、これらのプロバイダーの1つを使用してビットマップを取得します。

  BitMap bitMap;
  using (Stream resourceStream = provider.LoadBigLogo())
  {
   bitMap = BitMap.FromStream(resourceStream);
  }
于 2012-11-08T19:21:51.350 に答える
0

これは私が誰かから入手したコードで、私にとってはうまくいきました!

    private void SetImage(PictureBox pb) {
        try {
            Image img = pb.Image;

            Size imgSize = GenerateImageDimensions( img.Width, img.Height, pb.Width, pb.Height );
            Bitmap finalImg = new Bitmap( img, imgSize.Width, imgSize.Height );
            Graphics gfx = Graphics.FromImage( img );
            gfx.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

            pb.Image = null;
            pb.SizeMode = PictureBoxSizeMode.AutoSize;
            pb.Image = finalImg;
        } catch(Exception ex) {

        }
    }
    public Size GenerateImageDimensions(int currW, int currH, int destW, int destH) {
        //double to hold the final multiplier to use when scaling the image
        double multiplier = 0;

        //string for holding layout
        string layout;

        //determine if it's Portrait or Landscape
        if(currH > currW) layout = "portrait";
        else layout = "landscape";

        switch(layout.ToLower()) {
            case "portrait":
                //calculate multiplier on heights
                if(destH > destW) {
                    multiplier = (double) destW / (double) currW;
                } else {
                    multiplier = (double) destH / (double) currH;
                }
                break;
            case "landscape":
                //calculate multiplier on widths
                if(destH > destW) {
                    multiplier = (double) destW / (double) currW;
                } else {
                    multiplier = (double) destH / (double) currH;
                }
                break;
        }

        //return the new image dimensions
        return new Size( (int) (currW * multiplier), (int) (currH * multiplier) );
    }

編集:私の画像はすべてjpgであるため、これが透明な背景をどのように処理するかわかりません。

編集 2: またpb.SizeMode、ニーズに合わせて を調整する必要があります。私がやった方法は、の最大サイズを設定することでしたが、PictureBoxうまくいきました。

于 2012-11-08T19:22:17.013 に答える