Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.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
Php 背景图像是暗的还是亮的?_Php_Gd_Opendocument - Fatal编程技术网

Php 背景图像是暗的还是亮的?

Php 背景图像是暗的还是亮的?,php,gd,opendocument,Php,Gd,Opendocument,我正在用PHP进行ODP->HTML转换。我有以下问题: 使用样式:使用窗口字体颜色 属性来指定 窗口前景色应为 用作图像的前景色 浅色背景色和白色,用于 深色背景色 (OpenDocument规范版本1.0、15.4.4) 如果我有背景图像,我如何检查,如果这个图像是亮的还是暗的 你有什么想法吗 提前感谢,, Levu您可以使用一些图像处理算法来检查像素亮度并计算平均图像亮度 本文档将帮助您开始: 如果要使用GD,请尝试使用对图像像素进行采样。您可以确定颜色的RGB,如PHP手册页所示 下一步

我正在用PHP进行ODP->HTML转换。我有以下问题:

使用样式:使用窗口字体颜色 属性来指定 窗口前景色应为 用作图像的前景色 浅色背景色和白色,用于 深色背景色

(OpenDocument规范版本1.0、15.4.4)

如果我有背景图像,我如何检查,如果这个图像是亮的还是暗的

你有什么想法吗

提前感谢,,
Levu

您可以使用一些图像处理算法来检查像素亮度并计算平均图像亮度

本文档将帮助您开始:


如果要使用GD,请尝试使用对图像像素进行采样。您可以确定颜色的RGB,如PHP手册页所示

下一步,获取RGB样本,并使用图像分析仪确定其亮度


确定你认为光和暗的阈值,并据此分类。

< P>我认为这是一个很有趣的问题需要解决,所以我草拟了一个快速的脚本。遵循提供的其他建议

<?php

    // TODO supply your own filenames
    $filenames = array(
        'testpics/client-bella-vi.jpg',
        'testpics/istockphoto_8577991-concept-of-business-people-crowd.jpg',
        'testpics/medium-gray.jpg');

    // loop though each file
    foreach ($filenames as $filename) {

        echo "$filename<br/>";

        $luminance = get_avg_luminance($filename,10);
        echo "AVG LUMINANCE: $luminance<br />";

        // assume a medium gray is the threshold, #acacac or RGB(172, 172, 172)
        // this equates to a luminance of 170
        if ($luminance > 170) {
            echo "Black Text<br />";
        } else {
            echo 'White Text<br />';
        }

        echo "<br />";
    }
    exit;

    // get average luminance, by sampling $num_samples times in both x,y directions
    function get_avg_luminance($filename, $num_samples=10) {
        $img = imagecreatefromjpeg($filename);

        $width = imagesx($img);
        $height = imagesy($img);

        $x_step = intval($width/$num_samples);
        $y_step = intval($height/$num_samples);

        $total_lum = 0;

        $sample_no = 1;

        for ($x=0; $x<$width; $x+=$x_step) {
            for ($y=0; $y<$height; $y+=$y_step) {

                $rgb = imagecolorat($img, $x, $y);
                $r = ($rgb >> 16) & 0xFF;
                $g = ($rgb >> 8) & 0xFF;
                $b = $rgb & 0xFF;

                // choose a simple luminance formula from here
                // http://stackoverflow.com/questions/596216/formula-to-determine-brightness-of-rgb-color
                $lum = ($r+$r+$b+$g+$g+$g)/6;

                $total_lum += $lum;

                // debugging code
     //           echo "$sample_no - XY: $x,$y = $r, $g, $b = $lum<br />";
                $sample_no++;
            }
        }

        // work out the average
        $avg_lum  = $total_lum/$sample_no;

        return $avg_lum;
    }

我看到有很多不同的计算亮度的公式,我应该使用哪一个?Luma?这取决于你的具体需求,但我认为Luma或其他人可以解决你的问题。只需选择并修改你认为最容易理解的算法。我不需要完全理解算法,但结果必须完美:)出于你的目的,任何亮度处理算法都会给出完美而准确的结果。我只是建议你选择一个更容易理解的算法,因为这将使它更容易实现,或者如果你需要的话,甚至可以修改它。对于600x400左右的图像样本数量,你有什么建议?我觉得10点没用。。PS真棒的回答!!例如,它是107,非常轻,可能无法使用白色字体。快到97岁了,天很黑?(这是在使用100个num样本时)这是一个尝试和错误,但首先,您的图像是1024x683=700000像素左右,除以100,则每7000像素有一个样本。样本只需降落在海港内的几盏灯上,就可以将平均值剔除。我会把它放大一点,尝试1000个样品,看看你能得到什么。计时,看看什么是可接受的性能需求,另一个选择,不确定它是否更快将是模糊图像。如果我们稍微编辑一下你的函数,设置两个范围0-(照片的宽度)和0-(照片的高度),然后随机选择像素。存储像素并发出if语句以确保不再使用它?这肯定会带来更准确的结果吗?