2

我正在尝试获取一个数组PictureBox来显示图片列表(以 png 文件格式)。

我尝试使用 .NETImageList控件,但它坚持要重新调整我的图片大小。它也不支持那些 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。通常,您只有一个,但使用这种方法,您还可以托管多组资源,并在同一个资源 dll 中实现多个 IThemeResourceProvider。例如,您可以使用名称标识每个 IThemeResourceProvider,或者作为属性,或者在您的各种实现中使用自定义 [Attribute] 装饰。我会把剩下的留给你来解决。

但这里是如何在你的列表中实例化 IThemeResourceProviders

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

最后,使用这些提供程序之一获取位图:

  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 所以我不知道这将如何处理透明背景。

编辑二:您还需要调整pb.SizeMode以满足您的需求。我这样做的方法是为它设置一个最大尺寸,PictureBox并且效果很好。

于 2012-11-08T19:22:17.013 回答