因此,请考虑以下 Laravel 5.7 :
<?php
use Illuminate\Database\Seeder;
use App\Modules\Locations\Services\CreateMapService;
use ChristianEssl\LandmapGeneration\Struct\Color;
use App\Modules\Locations\Models\Location;
class SurfaceLocations extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$water = new Color(66, 129, 178);
$land = new Color(23, 132, 72);
$createImage = new CreateMapService($land, $water, 500, 500, 'random_map');
$createImage->generateMap('surface');
$contents = Storage::disk('maps')->get('surface.png');
$waterR = 66;
$waterG = 129;
$waterB = 178;
for ($x = 0; $x <= 500; $x++) {
for($y = 0; $y <= 500; $y++) {
$rgb = imagecolorat($contents, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
if ($r === $waterR && $g === $waterG && $b === $waterB) {
Location::create([
'x' => $x,
'y' => $y,
'is_water' => true
]);
} else {
Location::create([
'x' => $x,
'y' => $y,
'is_water' => false
]);
}
}
}
}
}
所以我创建了地图并保存,然后尝试输入图像的内容,然后将其传递给imagecolor,遍历图像的每个x,y位置以查看水rgb是否与输出匹配rgb。
但是我得到了错误:
imagecolorat()期望参数1为资源,给出字符串
因此,我查找了该资源是什么,并获得了imagecreatetruecolor()
函数,但是我不确定如何将其与创建和保存的图像一起使用。
关于如何在现有图像上使用此功能的任何想法?在文档中,使用创建图像的示例。
答案 0 :(得分:1)
您需要修复此行
$contents = Storage::disk('maps')->get('surface.png');
成为
$contents = imagecreatefromstring( Storage::disk('maps')->get('surface.png') );
并且您的代码将正常工作...因为在执行此操作时,您放入了不是图像资源的文件surface.png的$ contents内容...
只需将$ contents重命名为更直观的名称,因为那是图像资源,不再是内容