【问题标题】:How to get image in image?如何获得图像中的图像?
【发布时间】:2016-05-15 11:48:20
【问题描述】:

只是不知道该怎么做:

我们有一张图片,我们知道这张图片中一张卡片的常量WIDTHHEIGHT。我想在这张图片中显示一张图片。下一个常数是我们有多少张卡片,所以CNT_CARDS = 52。我不想创建每张卡片 - 只显示。我正在使用 winforms (C#)。

伪代码

加载图像。

每张卡都可以申请:

int offsetTop = row * HEIGHT;
int offsetLeft = column * WIDTH;
imageInImage.Location = new Point(offsetLeft, offsetTop);
imageInImage.Size = new Size(WIDTH, HEIGHT);

例如,如果我们想获得钻石女王:

int offsetTop = 2 * HEIGHT;
int offsetLeft = 11 * WIDTH;

【问题讨论】:

  • 为什么要这样做?您本质上是在要求与 CSS sprite 等效的 C#(服务器端),对吗?我认为这样做没有任何好处,因为您没有获得 CSS sprites 提供的优势,即单一下载到客户端计算机。您已经作为 WinForms 应用程序在客户端计算机上。那么,您将拥有一张图片而不是 52 张图片的唯一好处是什么?
  • 我想这样做,因为显示一个图像而不是 52。真的,这是 C# 的问题。当然,这是 CSS 中的正常操作,但如果您理解的话,我需要用 C# 解决这种情况。
  • 不,我知道你想在 C# 和 CSS 中做这件事,只是想知道更多这样做的动机。看起来您在下面有一些答案可以帮助您入门。

标签: c#


【解决方案1】:

使用 Graphics.DrawImage() 为单张卡片创建位图。样板示例实现可能如下所示:

    static Bitmap GetCardImage(Bitmap cards, int cardnum) {
        int width = cards.Width / 13;
        int height = cards.Height / 4;
        int left = width * (cardnum % 13);
        int top = height * (cardnum % 4);
        var bmp = new Bitmap(width, height,
            System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
        using (var gr = Graphics.FromImage(bmp)) {
            gr.DrawImage(cards,
                new Rectangle(0, 0, width, height),
                new Rectangle(left, top, width, height),
                GraphicsUnit.Pixel);
        }
        return bmp;
    }

您可以通过创建位图数组来进一步扩展它,以便在需要绘制它们时随时可用。你会在启动画面上做的事情。假设您将带有卡片面孔的图像添加为名为 CardFaces 的资源:

    static Bitmap[] CreateDeckImages() {
        var deck = new Bitmap[52];
        using (var images = Properties.Resources.CardFaces) {
            for (int cardnum = 0; cardnum < deck.Length; ++cardnum) {
                deck[cardnum] = GetCardImage(images, cardnum);
            }
        }
        return deck;
    }

未经测试,应该接近。

【讨论】:

    【解决方案2】:

    这应该是一个好的开始

            var bmp = new Bitmap(225, 315);
            var OriBmp = new Bitmap(@"c:\gnv4Q.jpg");
            var g = Graphics.FromImage(bmp);
    
            g.DrawImage(OriBmp,0,0,new Rectangle(225,315,225,315),GraphicsUnit.Pixel);
    
            bmp.Save(@"c:\test.png");
    

    【讨论】:

      【解决方案3】:

      另一种方法是将图像拆分为一组图像,每张卡片一个图像。

      ImageSplitter,是一个网站,目前有一个在线图片分割工具,可以用来高效的将OP的图片分割成一组图片,每张卡片一张图片。

      请注意,由于 OP 的图像为 2925 x 1260 像素,并且卡片在图像中跨越 4 行 x 13 列,因此结果将是一组 225 x 315 像素大小的卡片图像,下载到一个 zip 文件中使用讨论中的在线图像分割工具。

      在讨论中的在线图像分割工具网站上,您目前会在主页上找到上传图像的选项。在哪里可以找到,您可以:
      1. 点击上面写着“点击此处上传您的图片”的位置
      2. 点击“上传图片”
      3.图像上传后,在下一个屏幕上,选择“分割图像”工具
      4.然后输入工具上当前找到的行数和列数
      - 对于此图像,为行输入“4”,为列输入“13”
      5.接下来,点击工具上当前找到的“SPLIT IMAGE”

      按照上面的步骤1到5,一组图片,一张图片,包含在一个zip文件中,将被下载到讨论在线图片分割工具所使用的浏览器的下载文件夹中。

      Link to Visual Guide for the Online Image Splitting Tool

      【讨论】:

      猜你喜欢
      • 2014-08-21
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 2011-09-10
      • 2015-09-12
      • 1970-01-01
      • 2020-10-21
      相关资源
      最近更新 更多