使用php

时间:2015-05-24 23:22:00

标签: php

我有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);
?>

我怎么能制作那样做的脚本?

1 个答案:

答案 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);

?>

Source

一定会奏效。多次使用我自己:)