我正在尝试获取一个PictureBox
数组来显示图片列表(以png文件格式)。
我尝试使用.NET ImageList
控件,但它坚持要重新调整我的图片大小。它也不支持那些png文件的透明背景。
我还尝试使用Assembly
来检索我的文件:
_imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.png");
但代码不会返回任何资源文件,也不会抛出任何运行时错误。
我的问题是,有没有其他方法可以做到这一点?或者更好的是,我可以以某种方式使ImageList
控件不改变我的画面吗?感谢。
答案 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
的最大大小,并且运行良好。