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