显示图像的颜色直方图

时间:2011-11-20 05:00:02

标签: php image histogram

我在PHP中搜索一个函数,它将histogram从图像中提取到PNG文件。此PNG文件将位于与实际图像不同的文件夹中,并且该功能必须处理大图像(超过3 MB)。我确实找到了function almost similar to my request但功能无法处理大图像,它没有显示直方图,也没有显示他们网站上显示的图像(它只显示带边框的空白窗口)。

我希望你们可以帮助我。

提前致谢。

3 个答案:

答案 0 :(得分:0)

我们一直在为我们的项目使用这个: http://www.histogramgenerator.com/

我们没有遇到大图像的问题。这不是免费的,但我们肯定会感觉到它 值得我们支付的钱。该课程还提供了许多其他有趣的功能。

此致

答案 1 :(得分:0)

这是一个脚本,可以像 Photoshop 一样绘制简单的直方图(只是类似,因为我怀疑它会使用 sigmoid 函数或类似方法缩放两个轴)

我写了一个scale()函数,您可以在其中使用最后一个布尔参数来做线性直方图,或者使用平方根标度来增加低值。

<?php
    //Just in case GD needs more memory
    ini_set('memory_limit', '64M');

    $filename='image1.png';
    //Attempt to open 
    [$width, $height, $type]=getimagesize($filename);
    if($type==IMAGETYPE_PNG){
        $img=imagecreatefrompng($filename);
    }

    //Histogram initialization
    $hist = array(
      'red'=>array_fill(0,256,0),
      'green'=>array_fill(0,256,0),
      'blue'=>array_fill(0,256,0)
    );

    //Counting colors
    for($x=0;$x<$width;++$x){
        for($y=0;$y<$height;++$y){          
            $bytes=imagecolorat($img,$x,$y);
            $colors=imagecolorsforindex($img,$bytes);
            ++$hist['red'][$colors['red']];
            ++$hist['green'][$colors['green']];
            ++$hist['blue'][$colors['blue']];
        }
    }

    //Drawing histogram as a 256x128px image            
    $width=256;
    $height=128;
    $newimg=imagecreatetruecolor($width,$height);    
    //Max frequency for normalization
    $maxr=max($hist['red']);
    $maxg=max($hist['green']);                
    $maxb=max($hist['blue']);             
    $max=max($maxr,$maxg,$maxb);

    function scale($value,$max,$height,$scale=FALSE){
        $result=$value/$max; //normalization: value between 0 and 1
        $result=$scale?$result**0.5:$result; //sqrt scale       
        $result=$height-round($result*$height); //scaling to image height
        return $result;
    }

    $top=220; //255 seems too bright to me
    for($x=0;$x<$width;++$x){
        for($y=0;$y<$height;++$y){          
            $r=($y>scale($hist['red'][$x],$maxr,$height,TRUE))?$top:0;
            $g=($y>scale($hist['green'][$x],$maxg,$height,TRUE))?$top:0;
            $b=($y>scale($hist['blue'][$x],$maxb,$height,TRUE))?$top:0;
            $colors=imagecolorallocate($newimg,$r,$g,$b);
            imagesetpixel($newimg,$x,$y,$colors);
        }
    }

    //Saving the histogram as you need
    imagepng($newimg,'.subfolder/histogram.png');

    //Use the next lines, and remove the previous one, to show the histogram image instead
    //header('Content-Type: image/png');
    //imagepng($newimg);
    exit();
?>

请注意,我不是在检查文件名是否存在,无论getimagesize()imagecreatefrompng()是否都失败。

答案 2 :(得分:-1)

我用2MB(5800 x 5800)PNG图像测试了这个。基本上,“imagecreatefrompng()”方法耗费了大量内存。

因此,在拨打电话之前,我将内存增加到512M并将执行时间设置为5分钟

ini_set('memory_limit', '512M');
set_time_limit(5*60);

创建图像后,恢复内存限制

$im = ImageCreateFromPng($source_file); 
ini_restore('memory_limit');

参考:http://www.php.net/manual/en/function.imagecreatefrompng.php#73546