存储项目相关图片的好方法是什么?

时间:2012-11-08 19:18:12

标签: c# winforms

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

我尝试使用.NET ImageList控件,但它坚持要重新调整我的图片大小。它也不支持那些png文件的透明背景。

我还尝试使用Assembly来检索我的文件:
_imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.png"); 但代码不会返回任何资源文件,也不会抛出任何运行时错误。

我的问题是,有没有其他方法可以做到这一点?或者更好的是,我可以以某种方式使ImageList控件不改变我的画面吗?感谢。

2 个答案:

答案 0 :(得分: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中实现多个IThemeResourceProviders。你可以,例如使用名称标识每个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);
  }

答案 1 :(得分: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的最大大小,并且运行良好。