几周前,我发布了 Facebook Sliders With Mootools and CSS,它解释了如何创建控制图像高度、宽度和不透明度的 Facebook 风格的滑块:
稍微修改后,我修改了脚本以使用 PHP 保存生成的图像。
第 1 步:原始 XHTML 和 CSS
<img src="muse.jpg" id="muse" /> <div id="opacity-area"> <div id="opacity-slider"></div> </div> <div> <strong>Opacity:</strong> <span id="opacity-label"></span>% </div> <br /><br /> <div id="width-area"> <div id="width-slider"></div> </div> <div> <strong>Width:</strong> <span id="width-label"></span> pixels </div> <br /><br /> <div id="height-area"> <div id="height-slider"></div> </div> <div> <strong>Height:</strong> <span id="height-label"></span> pixels </div> <br /><br /> <p><a href="#" id="save-image">Save Customized Image</a></p>
#opacity-area, #width-area, #height-area { background:url(horizontal.jpg) 0 8px no-repeat; height:23px; width:500px; margin:0 0 5px 0; }
#opacity-slider, #width-slider, #height-slider { background:url(button-horizontal.jpg) no-repeat; width:33px; height:23px; cursor:pointer; }
以上代码在原文中有解释
第 2 步:新 Moo
window.addEvent('domready', function () {
/* opacity slider */
var mySlide = new Slider($('opacity-area'), $('opacity-slider'), {
steps: 100,
wheel: 1,
onChange: function(step){
$('opacity-label').set('html',step);
$('muse').set('opacity',step / 100);
}
}).set(100);
/* height slider */
var mySlide = new Slider($('height-area'), $('height-slider'), {
steps: 300,
wheel: 1,
onChange: function(step){
$('height-label').set('html',step);
$('muse').set('height',step);
}
}).set(300);
/* width slider */
var mySlide = new Slider($('width-area'), $('width-slider'), {
steps: 300,
wheel: 1,
onChange: function(step){
$('width-label').set('html',step);
$('muse').set('width',step);
}
}).set(300);
/* link click */
$('save-image').addEvent('click',function() {
alert('generating...');
$('muse').set('src','sliders-ajax-save-php.php?width=' + $('width-label').getText() + '&height=' + $('height-label').getText() + '&opacity=' + $('opacity-label').getText());
$('muse').setStyles({
'border':'2px dotted #999;',
'padding':'10px'
});
$('muse').set('opacity',100);
alert('done!');
});
});
我添加了一个 AJAX 花絮,可将宽度、高度和不透明度发送到 PHP 脚本。
第 3 步:PHP
/* do i even do anything? */
if(isset($_GET['opacity']) && isset($_GET['width']) && isset($_GET['height']))
{
//initial vars
$original_file = 'sliders/muse.png';
$opacity = intval($_GET['opacity']) / 100;
$width = intval($_GET['width']);
$height = intval($_GET['height']);
list($original_width,$original_height) = getimagesize($original_file);
//create a new, virtual image
$image = imagecreatetruecolor($width, $height);
$source = imagecreatefrompng($original_file);
filter_opacity($source,$opacity);
imagecopyresized($image,$source,0,0,0,0,$width,$height,$original_width,$original_height);
$background = imagecolorallocate($image, 0, 0, 0);
imagecolortransparent($image, $background); // make the new temp image all transparent
imagealphablending($image, false); // turn off the alpha blending to keep the alpha channel
//output
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
}
/* from PHP.net -- http://us2.php.net/manual/en/function.imagefilter.php */
function filter_opacity( &$img, $opacity ) //params: image resource id, opacity in percentage (eg. 80)
{
//get image width and height
$w = imagesx( $img );
$h = imagesy( $img );
//turn alpha blending off
imagealphablending( $img, false );
//find the most opaque pixel in the image (the one with the smallest alpha value)
$minalpha = 127;
for( $x = 0; $x < $w; $x++ )
for( $y = 0; $y < $h; $y++ )
{
$alpha = ( imagecolorat( $img, $x, $y ) >> 24 ) & 0xFF;
if( $alpha < $minalpha )
{ $minalpha = $alpha; }
}
//loop through image pixels and modify alpha for each
for( $x = 0; $x < $w; $x++ )
{
for( $y = 0; $y < $h; $y++ )
{
//get current alpha value (represents the TANSPARENCY!)
$colorxy = imagecolorat( $img, $x, $y );
$alpha = ( $colorxy >> 24 ) & 0xFF;
//calculate new alpha
if( $minalpha !== 127 )
{ $alpha = 127 + 127 * $opacity * ( $alpha - 127 ) / ( 127 - $minalpha ); }
else
{ $alpha += 127 * $opacity; }
//get the color index with new alpha
$alphacolorxy = imagecolorallocatealpha( $img, ( $colorxy >> 16 ) & 0xFF, ( $colorxy >> 8 ) & 0xFF, $colorxy & 0xFF, $alpha );
//set pixel with the new color + opacity
if( !imagesetpixel( $img, $x, $y, $alphacolorxy ) )
{ return false; }
}
}
return true;
}
如果 URL 中提供了所有必需的信息,我们将使用 PHP 的 GD 库创建一个新的“虚拟”图像。创建虚拟图像后,我们导入原始图像并修改其宽度、高度和不透明度。创建图像后,我们将其“推出”并用新图像替换页面上的原始图像。
注意事项
我想补充几点:
- 我从 PHP.net 中获取了一段代码来创建图像不透明度。
- 正如您可能看到的那样,不透明度代码的效果并不好。如果您有更好的代码建议,请告诉我。
- Christina Ricci 图片最初并不是透明的。我删除了图像的白色部分并自己使其透明。这不是精致的图像。
