我正在尝试在PHP中使用GD将图像缩小为固定的60色调色板。 (我知道结果看起来很糟糕,这是我正在写的一个程序的一小部分,用于识别视觉上相似或重复的图像)
我的调色板有一个8x8 60色的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种颜色,以及如何解决这个问题?
答案 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);
现在的结果是: