尝试在PHP / GD中将图像转换为固定调色板

时间:2013-12-23 14:45:25

标签: php gd

我正在尝试在PHP中使用GD将图像缩小为固定的60色调色板。 (我知道结果看起来很糟糕,这是我正在写的一个程序的一小部分,用于识别视觉上相似或重复的图像)

我的调色板有一个8x8 60色的png,在这里:

60 Color Palette http://6bf4752d2ea1006477e8-3cbc1620ffd57ce5e34c93b52b8ad439.r9.cf2.rackcdn.com/palette.png

和测试图像(颜色渐变):

Test Image http://6bf4752d2ea1006477e8-3cbc1620ffd57ce5e34c93b52b8ad439.r9.cf2.rackcdn.com/test2.png

我正在通过以下代码运行它,根据我的理解,这应该导致已经转换为我的调色板的test2.png版本:

$palette = imagecreatefrompng("palette.png");
$source   = imagecreatefrompng("test2.png");
$source_w = imagesx($source);
$source_h = imagesy($source);
$result   = imagecreate($source_w, $source_h);
imagepalettecopy($result, $palette);
imagecopy($result, $source, 0, 0, 0, 0, $source_w, $source_h);

header('Content-type: image/gif');
imagegif($result);

相反,结果看起来像这样:

Result http://6bf4752d2ea1006477e8-3cbc1620ffd57ce5e34c93b52b8ad439.r9.cf2.rackcdn.com/result.gif

有谁知道为什么我会得到超过60种颜色,以及如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果您只在复制图像后设置调色板,结果如下:有9种颜色(?!)。

<?php
$palette = imagecreatefrompng("palette.png");
$palette_w = imagesx($palette);
$palette_h = imagesy($palette);
$source   = imagecreatefrompng("test2.png");
$source_w = imagesx($source);
$source_h = imagesy($source);
$result   = imagecreate($source_w, $source_h);
imagecopy($result, $source, 0, 0, 0, 0, $source_w, $source_h);
imagepalettecopy($result, $palette);
header('Content-type: image/gif');
imagegif($result);

真正的诀窍是在......之前和之后设置......

<?php
$palette = imagecreatefrompng("palette.png");
$palette_w = imagesx($palette);
$palette_h = imagesy($palette);
$source   = imagecreatefrompng("test2.png");
$source_w = imagesx($source);
$source_h = imagesy($source);
$result   = imagecreate($source_w, $source_h);
imagepalettecopy($result, $palette);
imagecopy($result, $source, 0, 0, 0, 0, $source_w, $source_h);
//here is the trick
imagepalettecopy($result, $palette);
header('Content-type: image/gif');
imagegif($result);

现在的结果是: enter image description here