我有16个图像,每个图像大小为512,我需要使用PHP 4行和4列(4X4)组合它们,然后保存新图像。
我试过这个,但它似乎没有用!
<?php
$stars = imagecreatefrompng("images/1.jpg");
$gradient = imagecreatefrompng("images/2.jpg");
imagecopymerge($stars, $gradient, 0, 0, 0, 0, 256, 256, 60);
header('Content-type: image/png');
imagepng($stars);
imagedestroy($stars);
imagedestroy($gradient);
?>
我怎么能制作那样做的脚本?
答案 0 :(得分:4)
步骤1:获取包含源图像位置的数组 这个步骤对于任何人来说都是不同的,但是以最简单的形式你可以定义这样的东西:
$srcImagePaths = Array('https://diceattack.files.wordpress.com/2011/01/tile_e_o_fh.png',
'https://diceattack.files.wordpress.com/2011/01/tile_e_g_fh.png',
'https://diceattack.files.wordpress.com/2011/01/tile_e_b_fh.png',
'https://diceattack.files.wordpress.com/2011/01/tile_b_q_fh.png');
步骤2:定义一些度量并初始化空白的“背景”图像 这里我们使用第一个GD函数:imagecreatetruecolor()创建一个通用的“基础”图像,imagecolorallocate()用于定义RGB颜色,imagefill()用于填充我们的通用图像。
$tileWidth = $tileHeight = 28;
$numberOfTiles = 12;
$pxBetweenTiles = 1;
$mapWidth = $mapHeight = ($tileWidth + $pxBetweenTiles) * $numberOfTiles;
$mapImage = imagecreatetruecolor($mapWidth, $mapHeight);
$bgColor = imagecolorallocate($mapImage, 50, 40, 0);
imagefill($mapImage, 0, 0, $bgColor);
步骤3:
想想你希望源图像最终到达哪个坐标 有一些不同的方法来指定它,但如果你正在处理许多相同大小的图像,那么编写一个将(数组)索引映射到一组X,Y坐标的小函数是有意义的。这是我的,它们全部安排在12×12方格:
function indexToCoords($index)
{
global $tileWidth, $pxBetweenTiles, $leftOffSet, $topOffSet, $numberOfTiles;
$x = ($index % $numberOfTiles) * ($tileWidth + $pxBetweenTiles) + $leftOffSet;
$y = floor($index / $numberOfTiles) * ($tileWidth + $pxBetweenTiles) + $topOffSet;
return Array($x, $y);
}
步骤4:遍历源图像并将其复制到基本图像上 我们使用function imagecopy()来执行此操作,如下所示:
/ * *复制源图像到地图 * /
foreach ($srcImagePaths as $index => $srcImagePath)
{
list ($x, $y) = indexToCoords($index);
$tileImg = imagecreatefrompng($srcImagePath);
imagecopy($mapImage, $tileImg, $x, $y, 0, 0, $tileWidth, $tileHeight);
imagedestroy($tileImg);
}
注意我们如何在那里使用indexToCoords()函数 - 我们当然不希望所有&gt;源图像位于相同的位置。
步骤5(intermezzo):使用PHP调整图像大小 我们用于将源图像放在基本图像上的相同imagecopy()函数也可用于调整图像大小。如果你想自动生成缩略图,很方便!以下是您可以这样做的方法:
/ * *转换为THUMB格式 * /
$thumbSize = 200;
$thumbImage = imagecreatetruecolor($thumbSize, $thumbSize);
imagecopyresampled($thumbImage, $mapImage, 0, 0, 0, 0, $thumbSize, $thumbSize, $mapWidth, $mapWidth);
最后一步:设置标题告诉浏览器有图像到来,并输出最终图像
/ * *输出缩略图图像 * /
header ("Content-type: image/png");
imagepng($thumbImage); //change argument to $mapImage to output the original size image
就是这样!请注意,您可能不需要均匀填充的背景,而是需要真实的背景图像 - 您可以通过在步骤2中使用imagecreatefrompng()轻松完成此操作。
为方便起见,这里再一次使用了所有代码。
<?php
//Source image paths (DISCLAIMER: this is just to demonstrate, to generate a real TT map you need 144 of these)
<pre>$srcImagePaths = Array('https://diceattack.files.wordpress.com/2011/01/tile_e_o_fh.png',
'https://diceattack.files.wordpress.com/2011/01/tile_e_g_fh.png',
'https://diceattack.files.wordpress.com/2011/01/tile_e_b_fh.png',
'https://diceattack.files.wordpress.com/2011/01/tile_b_q_fh.png');
</pre>
/*
* INIT BASE IMAGE FILLED WITH BACKGROUND COLOR
*/
$tileWidth = $tileHeight = 28;
$numberOfTiles = 12;
$pxBetweenTiles = 1;
$leftOffSet = $topOffSet = 1;
$mapWidth = $mapHeight = ($tileWidth + $pxBetweenTiles) * $numberOfTiles;
$mapImage = imagecreatetruecolor($mapWidth, $mapHeight);
$bgColor = imagecolorallocate($mapImage, 50, 40, 0);
imagefill($mapImage, 0, 0, $bgColor);
/*
* PUT SRC IMAGES ON BASE IMAGE
*/
function indexToCoords($index)
{
global $tileWidth, $pxBetweenTiles, $leftOffSet, $topOffSet, $numberOfTiles;
$x = ($index % 12) * ($tileWidth + $pxBetweenTiles) + $leftOffSet;
$y = floor($index / 12) * ($tileWidth + $pxBetweenTiles) + $topOffSet;
return Array($x, $y);
}
foreach ($srcImagePaths as $index => $srcImagePath)
{
list ($x, $y) = indexToCoords($index);
$tileImg = imagecreatefrompng($srcImagePath);
imagecopy($mapImage, $tileImg, $x, $y, 0, 0, $tileWidth, $tileHeight);
imagedestroy($tileImg);
}
/*
* RESCALE TO THUMB FORMAT
*/
$thumbSize = 200;
$thumbImage = imagecreatetruecolor($thumbSize, $thumbSize);
imagecopyresampled($thumbImage, $mapImage, 0, 0, 0, 0, $thumbSize, $thumbSize, $mapWidth, $mapWidth);
header ("Content-type: image/png");
imagepng($thumbImage);
?>
一定会奏效。多次使用我自己:)