Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/90.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
生成html页面的C#程序-限制页面上的图像尺寸_C#_Html_Image_Dimensions - Fatal编程技术网

生成html页面的C#程序-限制页面上的图像尺寸

生成html页面的C#程序-限制页面上的图像尺寸,c#,html,image,dimensions,C#,Html,Image,Dimensions,我有一个C#程序,它根据存储在文件系统中的各种数据和图像生成大量html页面。html本身工作得很好,但是图像的尺寸可能会有很大的差异。我需要一种方法来确保给定的图像不会超过页面上的特定大小 实现这一点最简单的方法是通过html本身。。。如果有某种“maxwidth”或“maxheight”属性,我可以在html中设置,或者可能是一种强制图像放入表格单元格的方法(如果我使用类似的方法,我必须确保非违规维度将自动与正在缩减的维度进行缩放)。问题是,我对html中这种“微调”的东西不太了解,而且这对

我有一个C#程序,它根据存储在文件系统中的各种数据和图像生成大量html页面。html本身工作得很好,但是图像的尺寸可能会有很大的差异。我需要一种方法来确保给定的图像不会超过页面上的特定大小

实现这一点最简单的方法是通过html本身。。。如果有某种“maxwidth”或“maxheight”属性,我可以在html中设置,或者可能是一种强制图像放入表格单元格的方法(如果我使用类似的方法,我必须确保非违规维度将自动与正在缩减的维度进行缩放)。问题是,我对html中这种“微调”的东西不太了解,而且这对谷歌来说似乎是一件困难的事情(大多数解决方案都涉及某种html专门化;我只是使用普通html)

或者,我可以在运行时通过在C#中检查图像来确定每个图像的宽度和高度,如果图像的尺寸超过某个值,则在html中设置宽度/高度值。这里的问题是,仅仅为了获取图像的尺寸,将整个图像加载到内存中似乎效率极低。我需要一种方法来“窥视”一幅图像,并只获取其大小(可以是bmp、jpg、gif或png)


如果您对这两种方法有任何建议,我们将不胜感激。

标签上有一个标签。如果只指定一个,浏览器将在该维度中调整大小并保持纵横比。

CSS具有
max width
max height
属性。所有流行浏览器的最新版本都支持它们。

根据您所说的(以及一些假设,例如您将不止一次处理一个图像),在内存中缓存图像的维度似乎是提高效率的一件事。通过这种方式,您可以智能地在HTML或CSS中设置维度

有关如何获得分辨率的说明,请参阅(如果您还不知道-不幸的是,我不知道在不加载整个图像的情况下如何获得分辨率)。我鼓励您将图像变量保存在一个非常小的范围内,并尽快处理它


我不鼓励您无知地使用CSS的
max width
max height
属性,因为您将失去纵横比。

如果您担心处理图像大小重新计算的程序,可以选择将负担推到浏览器上。您可以使用javascript。此脚本将“调整”图像的大小,使其在客户端的最大高度/宽度为200像素

<script type="text/javascript" language="javascript">
    function img_resizer(img) {
        width = 0;
        height = 0;
        if (img.offsetWidth) {
            resizeImage(img.offsetWidth, img.offsetHeight)            
        }
        else {
            resizeImage(img.style.pixedWidth, img.style.pixelHeight);
        }
    }

    function resizeImage(width, height) {
        if (width > 200 || height > 200) {
            if (width > height) {
                height = (height / width) * 200;
                width = 200;
            }
            else {
                width = (width / height) * 200;
                height = 200;
            }

            img.style.width = width + 'px';
            img.style.height = height + 'px';
        }
    }
</script>

功能img\U重定器(img){
宽度=0;
高度=0;
if(img.offsetWidth){
调整图像大小(img.offsetWidth、img.offsetHeight)
}
否则{
调整图像大小(img.style.pixedWidth、img.style.pixelHeight);
}
}
函数大小图像(宽度、高度){
如果(宽度>200 |高度>200){
如果(宽度>高度){
高度=(高度/宽度)*200;
宽度=200;
}
否则{
宽度=(宽度/高度)*200;
高度=200;
}
img.style.width=宽度+px;
img.style.height=高度+px;
}
}



我知道在IE和Firefox上工作,你可能需要在Safari、Opera和Chrome等浏览器上做一些测试。但是我不知道,你可能只是想咬紧牙关,让程序来处理它。

没有考虑复制和粘贴的数量,嗯!我也想知道这一点,我所看到的只是无数缩放宽度或高度的例子。。谁会想要另一个满溢

  • 调整宽度和高度,无需循环
  • 不超过图像的原始尺寸
  • 使用正确的数学方法,即宽度/纵横比表示高度,高度*纵横比表示宽度,因此图像实际上可以正确地上下缩放:/
//////////////

private void ResizeImage(Image img, double maxWidth, double maxHeight)
{
    double srcWidth = img.Source.Width;
    double srcHeight = img.Source.Height;

    double resizeWidth = srcWidth;
    double resizeHeight = srcHeight;

    double aspect = resizeWidth / resizeHeight;

    if (resizeWidth > maxWidth)
    {
        resizeWidth = maxWidth;
        resizeHeight = resizeWidth / aspect;
    }
    if (resizeHeight > maxHeight)
    {
        aspect = resizeWidth / resizeHeight;
        resizeHeight = maxHeight;
        resizeWidth = resizeHeight * aspect;
    }

    img.Width = resizeWidth;
    img.Height = resizeHeight;
}

如果只设置
元素的一个属性:
width
height
(不是两者都设置,否则它将不起作用),图像将保持纵横比,其他未设置的值将自动调整。

不幸的是,这将丢失图像的纵横比。我对他的要求的理解(和一些假设)这意味着这可能会使一些小图像变大。他并没有说所有的图片都太大,这意味着可能会有一些小图片,这可能会产生一些不良影响。是的,这正是问题所在。我还需要保留每个图像的纵横比;如果我能用Html处理它,那可能就是最好的方法!谢谢你的反馈!如果只需在一次性构建过程中增加10秒,我可能会“咬紧牙关”,读入整个位图以获得尺寸。我希望能够扫描图像的标题信息,但每种文件类型都会有所不同,我真的不知道我是否愿意花那么多时间研究/编码一个爱好项目的某个方面!:)我最后做的是读取整个位图,但将每个图像的尺寸、文件大小和修改日期“缓存”到一个单独的文件中。在后续的运行中,我可以重用那些缓存的维度,除非图像的文件大小或日期修改值已更改。
private void ResizeImage(Image img, double maxWidth, double maxHeight)
{
    double srcWidth = img.Source.Width;
    double srcHeight = img.Source.Height;

    double resizeWidth = srcWidth;
    double resizeHeight = srcHeight;

    double aspect = resizeWidth / resizeHeight;

    if (resizeWidth > maxWidth)
    {
        resizeWidth = maxWidth;
        resizeHeight = resizeWidth / aspect;
    }
    if (resizeHeight > maxHeight)
    {
        aspect = resizeWidth / resizeHeight;
        resizeHeight = maxHeight;
        resizeWidth = resizeHeight * aspect;
    }

    img.Width = resizeWidth;
    img.Height = resizeHeight;
}