从图像生成调色板

gre*_*nie 5 php gd color-profile

为了好玩,我一直在研究如何使用GD库从图像创建调色板.到目前为止,我已经使用GD将用户上传的图像调整为适当的大小,以便在网页上显示.

现在,我希望能够从图像中获得大约五种左右的颜色,这些颜色代表了颜色范围.一旦我完成了这项工作,我想根据这些颜色生成一个补充调色板,然后我可以使用它来为页面上的不同元素着色.

我可以获得有关如何找到初始调色板的任何帮助将非常感谢!

编辑: 我来自我自己的解决方案,你可以在下面看到.

gre*_*nie 8

好吧,我花了几天时间摆弄,这就是我设法制作调色板的方法.它对我来说效果很好,你可以改变调色板的大小,从图像中返回更多或更少的颜色.

// The function takes in an image resource (the result from one
// of the GD imagecreate... functions) as well as a width and
// height for the size of colour palette you wish to create.
// This defaults to a 3x3, 9 block palette.
function build_palette($img_resource, $palette_w = 3, $palette_h = 3) {
    $width = imagesx($img_resource);
    $height = imagesy($img_resource);

    // Calculate the width and height of each palette block
    // based upon the size of the input image and the number
    // of blocks.
    $block_w = round($width / $palette_w);
    $block_h = round($height / $palette_h);

    for($y = 0; $y < $palette_h; $y++) {
        for($x = 0; $x < $palette_w; $x++) {
            // Calculate where to take an image sample from the soruce image.
            $block_start_x = ($x * $block_w);
            $block_start_y = ($y * $block_h);

            // Create a blank 1x1 image into which we will copy
            // the image sample.
            $block = imagecreatetruecolor(1, 1);

            imagecopyresampled($block, $img_resource, 0, 0, $block_start_x, $block_start_y, 1, 1, $block_w, $block_h);

            // Convert the block to a palette image of just one colour.
            imagetruecolortopalette($block, true, 1);


            // Find the RGB value of the block's colour and save it
            // to an array.
            $colour_index = imagecolorat($block, 0, 0);
            $rgb = imagecolorsforindex($block, $colour_index);

            $colour_array[$x][$y]['r'] = $rgb['red'];
            $colour_array[$x][$y]['g'] = $rgb['green'];
            $colour_array[$x][$y]['b'] = $rgb['blue'];

            imagedestroy($block);
        }
    }

    imagedestroy($img_resource);
    return $colour_array;
}
Run Code Online (Sandbox Code Playgroud)