imagecolorat()中的“资源”是什么?

时间:2019-02-27 20:54:41

标签: php laravel image

因此,请考虑以下 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()函数,但是我不确定如何将其与创建和保存的图像一起使用。

关于如何在现有图像上使用此功能的任何想法?在文档中,使用创建图像的示例。

1 个答案:

答案 0 :(得分:1)

您需要修复此行

$contents = Storage::disk('maps')->get('surface.png');

成为

$contents = imagecreatefromstring( Storage::disk('maps')->get('surface.png') );

并且您的代码将正常工作...因为在执行此操作时,您放入了不是图像资源的文件surface.png的$ contents内容...

只需将$ contents重命名为更直观的名称,因为那是图像资源,不再是内容