winforms 我需要帮助,以显示图片框中的图像从资源只有DLL在C#(winform)

5lwkijsr  于 2023-11-21  发布在  C#
关注(0)|答案(1)|浏览(238)

我是一个visual studio的新手,我正在创建一个winform,它可以根据用户通过单选按钮的输入,在图片框中选择并显示一个特定的图像,整个界面运行良好。
我通过项目内部的resx资源测试了大约50张图片,效果也很好。
问题->我将使用大约3500图像(最初3500,当项目完成时,它将是10.000+图像),每当我添加到resx所有这些图像,它只是停止工作。
可能的解决办法:
1.从外部文件结构加载图片(可以做,很容易,但我希望能够编译它,使最终用户无法看到,下载或修改'图像' -图像应该只能通过应用程序'查看')。(隐藏/编码在exe中)比这将是我的首选,但我好像找不到(然后我可以事后混淆的exe和有'一些'保护)这是一个非常容易的'文件夹结构'(4个文件夹,每个文件夹包含1000到3500张图像,当所有模块完成时)
1.使用DLL资源只存档,并将其包含在构建中。(首先要使用少量的图像),但我遇到了一些问题。我制作了一个只包含一些resx资源的DLL(一组PNG图像)-我第一次这样做,不确定我是否应该在那里添加或更改一些设置??(我把资源公开了)我在主应用程序的表单中引用了这个DLL。我还在上面做了'using...'。当我试图将它们加载到图片框中时,我能够看到资源。程序抛出一个错误,即无法将'byte'转换为'image'。我下面是一个很老的线程的建议,它表明直接引用DLL公共资源的方法应该有效......但它没有。
任何建议,无论是使用系统1或2和可能的帮助或解决方案,为他们?或任何更好的想法,我忽略了或不知道?(图片每个都是277 KB,重要的是用户没有直接访问它们的权限来复制/过去/分发/.)。如果可能的话,我更喜欢在构建中使用图像资源,而不是使用“云”解决方案,因为我希望在没有互联网的情况下可以访问所有内容。场景“s”,如在飞机上,等等。
lib reference
lib activated
old thread related to this
error message
Picbox command + error code

7uzetpgm

7uzetpgm1#

当你说你在.resx中添加了图片时,我不知道你是怎么做到的。但我会尝试直接操作.csproj文件来嵌入它们。我尝试生成3500个交替的测试图片(你说277 kb,这些正好是244 kb)。
x1c 0d1x的数据
接下来,我生成了可以复制到.csproj中的标记

  1. // Copy to cs.proj file
  2. for (int i = 0; i <= 3500; i++)
  3. {
  4. Debug.WriteLine(@$" <EmbeddedResource Include=""Images\sample-image-{i.ToString("D5")}.png"" />");
  5. }

字符串
.csproj中的最终结果是:

  1. <ItemGroup>
  2. <EmbeddedResource Include="Images\sample-image-00000.png" />
  3. <EmbeddedResource Include="Images\sample-image-00001.png" />
  4. <EmbeddedResource Include="Images\sample-image-00002.png" />
  5. <EmbeddedResource Include="Images\sample-image-00003.png" />
  6. <EmbeddedResource Include="Images\sample-image-00004.png" />
  7. <EmbeddedResource Include="Images\sample-image-00005.png" />
  8. <EmbeddedResource Include="Images\sample-image-00006.png" />
  9. <EmbeddedResource Include="Images\sample-image-00007.png" />
  10. <EmbeddedResource Include="Images\sample-image-00008.png" />
  11. <EmbeddedResource Include="Images\sample-image-00009.png" />
  12. <EmbeddedResource Include="Images\sample-image-00010.png" />
  13. <EmbeddedResource Include="Images\sample-image-00011.png" />
  14. .
  15. .
  16. .
  17. <EmbeddedResource Include="Images\sample-image-03497.png" />
  18. <EmbeddedResource Include="Images\sample-image-03498.png" />
  19. <EmbeddedResource Include="Images\sample-image-03499.png" />
  20. <EmbeddedResource Include="Images\sample-image-03500.png" />
  21. </ItemGroup>


然后,您所需要的就是一个扩展来将嵌入的图像加载到图片框中。

  1. static class Extensions
  2. {
  3. public static Image FromNamedResource(this string name)
  4. {
  5. using (Stream imageStream = typeof(MainForm).Assembly.GetManifestResourceStream(name))
  6. {
  7. if (imageStream == null)
  8. {
  9. return new Bitmap(0, 0);
  10. }
  11. else
  12. {
  13. return new Bitmap(imageStream);
  14. }
  15. }
  16. }
  17. }


这个可执行文件有3/4千兆字节,但是它看起来构建和运行都很好,也许你可以以此为起点,做进一步的实验。
下面是我用来测试这个答案的代码:


  1. namespace images_from_embedded_resource
  2. {
  3. public partial class MainForm : Form
  4. {
  5. const int MAX_IMAGES = 3500;
  6. public MainForm()
  7. {
  8. InitializeComponent();
  9. buttonUpArrow.Text = "\u2191";
  10. buttonDownArrow.Click += (sender, e) => Index = Math.Min(Index + 1, MAX_IMAGES);
  11. buttonDownArrow.Text = "\u2193";
  12. buttonUpArrow.Click += (sender, e) => Index = Math.Max(Index - 1, 0);
  13. pictureBox.BackgroundImageLayout = ImageLayout.Stretch;
  14. Index = 0;
  15. #if GENERATE_TEST_IMAGES
  16. for (int i = 2; i <= 3500; i++)
  17. {
  18. // Alternating test images
  19. if(i%2 == 0)
  20. {
  21. File.Copy(
  22. @"D:\Github\stackoverflow\Tozz\images-from-embedded-resource\images-from-embedded-resource\Images\sample-image-00000.png",
  23. $@"D:\Github\stackoverflow\Tozz\images-from-embedded-resource\images-from-embedded-resource\Images\sample-image-{i.ToString("D5")}.png",
  24. overwrite: true
  25. );
  26. }
  27. else
  28. {
  29. File.Copy(
  30. @"D:\Github\stackoverflow\Tozz\images-from-embedded-resource\images-from-embedded-resource\Images\sample-image-00001.png",
  31. $@"D:\Github\stackoverflow\Tozz\images-from-embedded-resource\images-from-embedded-resource\Images\sample-image-{i.ToString("D5")}.png",
  32. overwrite: true
  33. );
  34. }
  35. }
  36. #endif
  37. #if GENERATE_CSPROJ_TAGS
  38. // Copy to cs.proj file
  39. for (int i = 0; i <= 3500; i++)
  40. {
  41. Debug.WriteLine(@$" <EmbeddedResource Include=""Images\sample-image-{i.ToString("D5")}.png"" />");
  42. }
  43. #endif
  44. // Make sure resources are embedded
  45. foreach (var name in typeof(MainForm).Assembly.GetManifestResourceNames().Where(_ => _.Contains(".png")))
  46. {
  47. Debug.WriteLine(name);
  48. }
  49. }
  50. int _index = -1;
  51. public int Index
  52. {
  53. get => _index;
  54. set
  55. {
  56. if (!Equals(_index, value))
  57. {
  58. _index = value;
  59. pictureBox.BackgroundImage = $"images_from_embedded_resource.Images.sample-image-{Index.ToString("D5")}.png".FromNamedResource();
  60. Text = $"{Index.ToString("D5")}";
  61. }
  62. }
  63. }
  64. }
  65. }

展开查看全部

相关问题