【问题标题】:Load undefined images from folders从文件夹加载未定义的图像
【发布时间】:2019-12-09 04:04:47
【问题描述】:

我看到了许多类似的线程,但没有任何东西可以帮助我解决我的问题。我是 c# 的新手,我想将 3 个图像从表单上的 3 个不同文件夹加载到 3 个图片框中,然后再打印。图像由第三方应用程序通过屏幕截图创建并保存在这些文件夹中。 尽管如此,我无法定义他们的名字,这会导致文件路径出现问题,我认为...... 我没有创建 SystemWatchFolder,而是看到有人在使用: open.Filter = "Image Files (*.png)|*.png" 这是一般工作还是我需要一个监视文件夹?

我尝试合并来自类似项目的代码,最后得到了下面的代码(顺便说一句,抱歉发布了整个代码)。 我还尝试将路径更改为: (@"C:....) 同样的错误信息。

我真的需要并感谢您的帮助、cmets、想法等。

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    Bitmap bmp = new Bitmap("C:\\Users\\Public\\1-2d27a482-b755\\Files\\Snapshots\\Snapshot2\\");
    OpenFileDialog open = new OpenFileDialog();
    open.Filter = "Image Files (*.png)|*.png";

    pictureBox1.Image = bmp;

}
private void PictureBox1_Click(object sender, EventArgs e)
{

    Bitmap bmp = new Bitmap("C:\\Users\\Public\\1-2d27a482-b755\\Files\\Snapshots\\Snapshot2\\");
    OpenFileDialog open = new OpenFileDialog();
    open.Filter = "Image Files (*.png)|*.png";

    pictureBox2.Image = bmp;

}

private void PictureBox2_Click(object sender, EventArgs e)
{
    Bitmap bmp = new Bitmap("C:\\Users\\Public\\1-2d27a482-b755\\Files\\Snapshots\\Snapshot3\\");
    OpenFileDialog open = new OpenFileDialog();
    open.Filter = "Image Files (*.png)|*.png";

    pictureBox3.Image = bmp;

}
private void PictureBox3_Click(object sender, EventArgs e)

框中的图像未显示,我收到此错误:

System.ArgumentException: '参数无效。'

对于这一行: Bitmap bmp = new Bitmap("C:\\Users\\Public\\1-2d27a482-b755\\Files\\Snapshots\\Snapshot1\\");

【问题讨论】:

  • 先找到OpenFileDialog的图片文件。然后在构造函数中创建带有图像路径的Bitmap
  • 为什么 Form1_Load 与 pictureBox1 一起使用,因为它是 PictureBox1_Click?名称错误,或者您在单击和表单加载后未尝试打开文件对话框?
  • @Lemm 非常感谢您的帮助和这些不同的选择。我刚刚意识到我必须在没有 openFileDialog 的情况下尝试它,因为我希望在没有交互的情况下加载图像
  • @Lemm 问题是图像目前不存在。 “快照 2”是拍摄后保存图像的文件夹。然后应该显示它,而不浏览方向
  • 您应该定期检查图片是否存在于文件夹中,如果保存则加载它。问题是您需要在创建文件之前知道文件名,或者确保此文件夹仅包含您需要的那些文件。阅读有关实施此docs.microsoft.com/en-us/dotnet/api/… 的时间

标签: c# windows forms png image-gallery


【解决方案1】:

你做错了什么

首先,您的Bitmap 应该指向您的图片。所以必须在用户选择OpenFileDialog 中的图片后在最后进行初始化。此外,您从未打开过您的OpenFileDialog。

所以你所有的方法都应该是这样的:

private void PictureBox1_Click(object sender, EventArgs e)
{
    OpenFileDialog open = new OpenFileDialog();
    open.Filter = "Image Files (*.png)|*.png|All files (*.*)|*.*";
    if (open.ShowDialog() == DialogResult.OK)
    {
        Bitmap bmp = new Bitmap(open.FileName);
        pictureBox1.Image = bmp;
    }
}

更好的方法

你真的不需要创建三个类似的方法来做同样的事情。 您只能创建一个并在所有图片框中使用它:

private void PictureBox_Click(object sender, EventArgs e)
{
    OpenFileDialog open = new OpenFileDialog();
    open.Filter = "Image Files (*.png)|*.png|All files (*.*)|*.*";
    if (open.ShowDialog() == DialogResult.OK)
    {
        Bitmap bmp = new Bitmap(open.FileName);
        PictureBox targetPictureBox = e.Source as PictureBox;
        targetPictureBox.Image = bmp;
    }
}

【讨论】:

    【解决方案2】:

    在以下代码中:

    Bitmap bmp = new Bitmap("C:\\Users\\Public\\1-2d27a482-b755\\Files\\Snapshots\\Snapshot2\\");
    OpenFileDialog open = new OpenFileDialog();
    open.Filter = "Image Files (*.png)|*.png";
    
    pictureBox2.Image = bmp;
    

    有两个问题:

    问题 1

    行内:

    Bitmap bmp = new Bitmap("C:\\Users\\Public\\1-2d27a482-b755\\Files\\Snapshots\\Snapshot2\\");
    

    您正在从文件加载Bitmap 图像。路径:

    "C:\\Users\\Public\\1-2d27a482-b755\\Files\\Snapshots\\Snapshot2\\"
    

    不正确,因为它不能以 \\ 结尾。 它应该以Snapshot2 或Snapshot2.png 结尾,具体取决于文件名。

    问题 2

    在行中:

    OpenFileDialog open = new OpenFileDialog();
    open.Filter = "Image Files (*.png)|*.png";
    

    您正在初始化一个OpenFileDialog,但没有使用它。您可以使用文件对话框获取文件名,也可以像在第一行中那样对文件名进行硬编码,但您正在混淆主题。

    选项 1:硬编码文件名

    这应该可以工作,假设文件名是Snapshot2.png:

    Bitmap bmp = new Bitmap("C:\\Users\\Public\\1-2d27a482-b755\\Files\\Snapshots\\Snapshot2.png");
    pictureBox2.Image = bmp;
    

    选项 2:使用文件对话框

    OpenFileDialog open = new OpenFileDialog();
    open.Filter = "Image Files (*.png)|*.png";
    if (open.ShowDialog() == DialogResult.OK)
    {
        pictureBox2.Image = new Bitmap(open.FileName);
    }
    

    【讨论】:

    • 非常感谢您的回答和这些选项。我更喜欢选项 1,因为我希望在没有文件对话框或用户交互的情况下发生这种情况。因此我需要知道,如果我需要对表单本身进行更改?因为不知何故它仍然对我不起作用......我需要添加任何代码才能使选项 1 起作用吗?
    • 问题是,图像不存在。这就是为什么我试图进入文件夹并只显示创建的图像。 “快照 2”是文件夹,而不是图像。
    • 您需要图像的完整路径。如果图像名称是 img.png 并且它是文件夹路径 C:\Users\Public\1-2d27a482-b755\Files\Snapshots\Snapshot2 而不是完整路径是 C:\Users\Public\1-2d27a482-b755\Files\Snapshots\Snapshot2\img.png 并且在您的代码中您需要编写:Bitmap bmp = new Bitmap("C:\\Users\\Public\\1-2d27a482-b755\\Files\\Snapshots\\Snapshot2\\img.png");
    • 感谢您的快速响应。那么,当我不知道图像名称时,有没有办法完成这项工作?该名称是通过快照程序自动/随机设置的,我无法更改。这就是为什么我在拍摄之前不知道它......如果文件夹“Snaphot2”只包含这个创建的图像怎么办?那么有没有办法显示文件夹“Snapshot2”的内容呢?
    • 使用System.IO.Directory.EnumerateFiles(folderPath)获取文件夹路径下的所有文件
    猜你喜欢
    • 1970-01-01
    • 2018-07-03
    • 2012-11-24
    • 1970-01-01
    • 2022-08-15
    • 2012-07-28
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多