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