我正在用PHP进行ODP-> HTML转换。我有一个问题,以下内容:背景图像黑暗还是光线?
使用的样式:使用窗口的字体,颜色 属性来指定 窗口前景色是否应该不会像作为前景色为 浅色背景 颜色和白色为 深色背景颜色。
(OpenDocument格式规范1.0版,15.4.4)
如果我有一个背景图像,如何检查,如果这个形象是浅色或深色?
你有什么想法吗?
由于提前, 岛
我正在用PHP进行ODP-> HTML转换。我有一个问题,以下内容:背景图像黑暗还是光线?
使用的样式:使用窗口的字体,颜色 属性来指定 窗口前景色是否应该不会像作为前景色为 浅色背景 颜色和白色为 深色背景颜色。
(OpenDocument格式规范1.0版,15.4.4)
如果我有一个背景图像,如何检查,如果这个形象是浅色或深色?
你有什么想法吗?
由于提前, 岛
我认为这是一个很有趣的问题来解决,所以我设计了一个简单快速的脚本来做到这一点。按照提供的其他建议
<?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;
}
你可能使用一些图像处理算法,将检查像素的亮度和计算平均图像亮度。
该文件将让你开始:
http://www.kweii.com/site/color_theory/2007_LV/BrightnessCalculation.pdf
我看到有很多不同的公式计算亮度,我应该使用哪一个?亮度? – levu 2011-05-08 06:53:42
这取决于您的确切需求,但我认为luma或任何其他人都可以为您的问题做好工作。 – oktalBlizzard 2011-05-08 07:11:59
只需选择并修改你认为最容易理解的算法。 – oktalBlizzard 2011-05-08 07:15:06
如果你正在寻找使用GD,使用imagecolorat
采样图像的像素尝试。您可以确定PHP手册页上显示的颜色的RGB。
接着,取RGB样品(多个),并使用basic luminance formula确定它们的亮度。
确定你考虑光与暗,并相应分类的阈值。
您对600x400左右的图片样本数量有何建议?我认为10是不是真的工作.. PS真棒答案! – maxisme 2015-09-02 16:27:51
例如https://farm6.staticflickr.com/5478/14085542631_6649f0a995_b.jpg即将为107,这是很轻,可能不会用白色字体的工作。和https://farm4.staticflickr.com/3912/15197127275_74754c631f_b.jpg即将到来97,它非常黑暗? (这是100个NUM样品时) – maxisme 2015-09-02 16:34:57
这是一个有点试验和错误的,但对于一个开始你的形象是1024x683 = 700000个像素左右,除以100,你必须每7000个像素1个样本。样本只需要着陆在港口的这些灯光中的一些灯上,它就会将平均值抛出。我会碰一下,尝试1000个样本,看看你得到了什么。时间,看看什么是您的性能需求尚可, – bumperbox 2015-09-02 21:00:35