如何将字符串转换为ImageFormat类属性?

7

目前我有这个:

printscreen.Save(myOutputLocation + myImageName + myImageExtension, ImageFormat.Png);

然而,我想用一个字符串来指定ImageFormat类的属性,但我无法让它工作:

string myString = textBox1.Text;
printscreen.Save(myOutputLocation + myImageName + myImageExtension, ImageFormat.myString);
3个回答

5
我会编写一个使用反射的方法ParseImageFormat,并将其用作:
printscreen.Save(myOutputLocation + myImageName + myImageExtension, 
                 ParseImageFormat(myString));

其中myString应该是以下其中之一:MemoryBmp,Bmp,Emf,Wmf,Gif,Jpeg,Png,Tiff,Exif,Icon


public static ImageFormat ParseImageFormat(string str)
{
    return (ImageFormat)typeof(ImageFormat)
            .GetProperty(str, BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase)
            .GetValue(null);
}

谢谢。这个有效,但我必须将“.GetValue(null)”更改为“.GetValue(str, null)”。 - Xrio

1

您可以仅使用任何一种 定义格式ImageFormat:

Bmp, Emf, Exif, Gif, Guid, Icon, Jpeg, MemoryBmp, Png, Tiff, Wmf

如果您想设置自己的格式,请使用:


printscreen.Save(myOutputLocation + myImageName + myImageExtension);

经过一些测试,我发现这个解决方案不起作用。如果我执行printscreen.Save(@"C:\path\image.jpeg");, 它会将图像保存为PNG格式,但是文件扩展名是.jpeg。 - Xrio
@Xrio 那问题出在哪里呢?当然,如果你只指定了 image.jpeg,它不会将你的 JPEG 转换为 PNG。如果你想要转换它,那么就使用 ImageFormat.XXX。如果没有你需要的格式,那么你应该手动进行转换。 - Roman Marusyk
我正在尝试根据用户输入更改ImageFormat.XXX。 - Xrio

0

ImageFormat是一个非常简单的类,它只有一些属性和类似属性的方法,所以你不能做你试图做的事情。(这本来就是错误的,我稍后会解释。)

您可以在此处获取类内容的详细列表:https://msdn.microsoft.com/en-us/library/system.drawing.imaging.imageformat(v=vs.110).aspx

然而,根据您实际尝试做什么,可能会有其他方法来完成。我猜您正在尝试根据用户输入保存特定格式的文件。ImageFormat.mystring永远不会起作用,但如果字符串是受支持的格式之一(请参见上面的链接),您可能可以遍历不同的格式以找到所需的格式。

一种非常基本且相当慢的方法是像这样做的。(我已经很久没有写过C#了,这可能是丑陋的代码。)

ImageFormat[] supported_formats = [ImageFormat.GIF, ImageFormat.Bmp]; /* etc */
byte index = 0;
ImageFormat curr_format;
do 
{
     curr_format = supported_formats[i++];
} while (curr_format.ToString() != user_string);

/* curr_format now holds user-entered format */

现在,关于为什么你所尝试的方式是错误的。

除非您使用反射或装饰器(也许),否则无法处理类似于这样的类。您试图强制一个类(ImageFormat)拥有一个属性(your_string),其名称将根据动态输入而更改。虽然可以这样做(可能已经在其他答案中提到),但我认为对于如此简单的用例来说并不实用,并且您可能最终会花费很多时间去做一些(保存)看起来并不需要性能,也似乎不会经常使用的东西。

但是,您仍然可以在各种网站上找到有关这种事情的文档,因为它可能仍然对您有兴趣。

谷歌给了我这些链接: http://www.dofactory.com/net/decorator-design-pattern - 装饰器 https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/reflection - 反射


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接