确定给定空间中图像的最佳尺寸

时间:2015-04-23 14:18:24

标签: c# winforms bitmap

我想要的: image =一个方形位图,宽度=高度 所有图像的大小完全相同

我有一个程序在容器上绘制图像。 在这种情况下,图像是生成的位图。 容器的尺寸是通用的(与表单的客户化大小相同)。

我想要按行和列布置图像。但是绘图部分应该计算给定数量的图像最多适合多少行和多少列,并调整图像大小以使它们适合。

我得到了什么: 用于调整图像所在对象大小的代码

    public void ResizeScreen(Size newSize)
    {
        this.size = newSize;
        InitializeObjectSize();
    }

调整图片大小的代码

public void InitializeObjectSize()
        {
            int objectSize;
            int spacing = 10;
            if ((this.size.Height - 2 * spacing) <= (this.size.Width - ((objects.Count + 1) * spacing)) / objects.Count)
            {
                objectSize = this.size.Height - (2 * spacing);

            }
            else
            {
                objectSize = (this.size.Width - ((objects.Count + 1) * spacing)) / objects.Count;
            }
        foreach (Object object in objects)
        {
            object.Size = objectSize;
        }
    }

绘制图像的代码/ 这个图像水平和垂直居中并绘制它们。

public void DrawObjects()
    {

        if (objects[0].Image != null)
        {
            drawImage = new Bitmap(size.Width, size.Height);
            System.Drawing.Graphics tempGraphics = Graphics.FromImage(drawImage);
            int spacing = 10;
            int totalwidth = this.size.Width; //- ((objects.Count * spacing) + spacing);
            int totalUsedWidth = objects.Count * objects[0].Size + ((objects.Count * spacing) + spacing);
            int realign = (totalwidth - totalUsedWidth) / 2;
            for (int i = 0; i < objects.Count; i++)
            {

                int startxposition = (objects[i].Size * i + 10 * i + 10) + realign;
                int startyposition = (size.Height - objects[i].Size) / 2;
                tempGraphics.DrawImage(objects[i].ObjectImage, startxposition, startyposition);
            }
            tempGraphics.Dispose();
        }
    }

2 个答案:

答案 0 :(得分:1)

首先你需要宽高比

Double squares = columns * columns * aspectRatio;

使用纵横比,您需要进行计算,将多个列转换为多个正方形。

    Double columns = Math.Ceiling(Math.Sqrt(squares / aspectRatio));
    Double rows = Math.Ceiling(columns * aspectRatio);
    Double actualSquares = rows * columns;
    Double squareWidth = width / columns;
    Double squareHeight = height / rows;

您需要的最小平方数大于您所拥有的平方数,因此请反转公式。

Math.Ceiling

请注意,由于<?php $url = $_SERVER['HTTP_HOST']; $uri = $_SERVER['REQUEST_URI']; function generateLink($url, $uri){ if(strpos($url,'domain-a.com') !== false){ $link = 'http://domain-b.com' . $uri; return $link; }else if(strpos($url,'domain-b.com') !== false){ $link = 'http://domain-c.com' . $uri; return $link; }else if(strpos($url,'domain-c.com') !== false){ $link = 'http://domain-a.com' . $uri; return $link; } } ?> <a href="<?php echo generateLink($url, $uri); ?>">Link</a> 您的方块不会是正方形。您需要取较小的数字并计算剩余部分以形成边距,然后您可以填充每个方格或形成边框

答案 1 :(得分:0)

这就是我解决它的方式。 这是一种蛮力方法。(它将尝试所有组合并选择最佳

        public void SetObjectSize()
        {
            int objectSize = 0;
            for (int objectsPerRow = 1; objectsPerRow <= objects.Count ; objectsPerRow++)
            {
                int rows =(int)Math.Ceiling(((double)objects.Count) / objectsPerRow);
                int horizontalSize = (this.size.Height - (rows * spacing + spacing)) / rows;
                int verticalSize = (this.size.Width - (objectsPerRow * spacing + spacing)) / objectsPerRow;
                int newSize = horizontalSize < verticalSize ? horizontalSize : verticalSize ;
                if (newSize > objectSize)
                {
                    this.rows = rows;
                    this.objectsPerRow = objectsPerRow ;
                    objectSize = newSize;
                }
            }
         }