2014-10-06 3 views
0

배경, 이미지를 아스키 아트로 변환 중입니다. 이것은 완벽하게 작동하며 24 비트 색상으로도 작동하여 색상을 올바른 RGB 값으로 변환합니다. 그러나 이제 ASCII 형식의 아트를 24 비트가 아닌 4 비트 색상 표로 렌더링하려고합니다.PHP가 24 비트 색상을 4 비트로 변환합니다.

24 비트 색상을 PHP로 4 비트로 변환하려면 어떻게해야합니까?

보다 구체적으로, 주어진 16 진수 또는 RGB 값을 변환해야하는 표준 IRC 컬러 팔레트가 있습니다. 4 비트 색상으로 변환 할 때 가능한 한 색상이 일치하는 것이 좋습니다.

내가 가지고있는 다른 아이디어는 색상 자체를 벗어나려고하기 전에 이미지 자체를 4 비트 팔레트 (GD를 사용하여 색상을 읽는 데 사용)로 변환하는 것입니다. 또 다른 아이디어는 다음 색상 각각에 대해 색상 범위를 정의하고 주어진 24 비트 색상이 범위 내에 있는지 확인하는 것입니다. 그러나 모든 색상의 범위를 해당 팔레트로 가져 오는 방법을 알지 못합니다.

enter image description here

답변

0

결국 imagemagick을 둘러싼 멋진 제안에도 불구하고 곧바로 php를 사용하는 좋은 해결책을 발견했습니다. https://github.com/nalipaz/php-color-difference

적절한 예는 다음과 같습니다 :

<?php 
include('lib/color_difference.class.php'); 

$palette = array(
    '00' => array(255, 255, 255), 
    '01' => array(0, 0, 0), 
    '02' => array(0, 0, 139), 
    '03' => array(0, 128, 0), 
    '04' => array(255, 0, 0), 
    '05' => array(139, 0, 0), 
    '06' => array(128, 0, 128), 
    '07' => array(255, 165, 0), 
    '08' => array(255, 255, 0), 
    '09' => array(50, 205, 50), 
    '10' => array(0, 128, 128), 
    '11' => array(173, 216, 230), 
    '12' => array(0, 0, 255), 
    '13' => array(255, 105, 180), 
    '14' => array(128, 128, 128), 
    '15' => array(211, 211, 211), 
); 

$color_rgb = array(255, 255, 128); 
$color_delta_e = new color_difference($color_rgb); 
$match_index = $color_delta_e->getClosestMatch($palette); 
$color = $palette[$match_index]; 
내가 GitHub의에서 발견 PHP-색차 라이브러리의 수정 된 버전과 델타 E 2000의 사용을 통해 가장 가까운 색상을 계산할 수 있었다, 여기 내 포크입니다

저는이 솔루션과 오버 헤드의 양이 매우 만족합니다. 제안들 주셔서 고마워.

0

나는 ImageMagick이 (또는 GraphicsMagick)가 -depth 옵션을 사용하여이 작업을 수행 할 수 있다고 생각합니다. 여기에 대한 논의가 있습니다 : http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=15395

업데이트 : ImageMagick은 PHP 라이브러리가 아니지만, PFCL 래퍼 (imagick)를 http://pecl.php.net/package/imagick에 추가해야합니다.

+0

ImageMagick은 많은 번거 로움없이 요구 사항이 될 수 있습니다. 이 권리를 사용하기 전에 jpe? g와 gif를 png로 변환해야 할 필요가 있습니까? –

+0

-depth 옵션은 여러 포맷에서 작동한다고 생각합니다. http://www.imagemagick.org/script/command-line-options.php#depth를 참조하십시오. – cjs1978

+0

변화하는 깊이를 들여다 봅니다. 그것은 아마도 도움이 될 수 있지만 위 팔레트의 색상으로 색상을 바꿀 필요가 있다고 설명하지 않습니다. 결과 이미지는 위 팔레트의 색상 이미지 만 필요합니다. 아마도 깊이를 16으로 줄인 다음 16 색을 각각 위의 색으로 바꿀 수 있습니다. 그러나 색상 교체를 연구하고 위의 각 색상을 결과 이미지의 적절한 색상과 일치시켜야합니다. –

0

imagetruecolortopalette을 사용하면 색상을 줄일 수 있지만 결과가 크게 달라질 수 있으며 색상을 정확하게 '매핑'하거나 팔레트를 지정하는 방법이 있는지 알 수 없습니다.

테스트 이미지 (24 비트)

Bliss

은 (디더링없이) 4 비트로 감소 :에

$img = imagecreatefrompng('Bliss.png'); 
imagetruecolortopalette($img, false, 16); 
imagepng($img, 'Bliss2.png'); 

Bliss, without dithering

감소 4 비트 (위트 시간 디더링) : 당신이 볼 수 있듯이

$img = imagecreatefrompng('Bliss.png'); 
imagetruecolortopalette($img, true, 16); 
imagepng($img, 'Bliss3.png'); 

Bliss, with dithering

, 결과는 완벽과는 거리가 멀다. 그러나 아마도 이것은 당신에게 좋은 출발점 일 것입니다.

0

이미지의 색상을 색상 견본의 색상 표에 매핑하려면 remap을 사용해야한다고 생각합니다. 이 같은 명령 줄에서 그것을 할 :

convert image.jpg -remap palette.jpg out.jpg 

당신은, 또는 dither 옵션을하지 않을 수있다 -을 확인하십시오.(이 너무 큰, 당신은 정말 작은 이미지가 필요 - 내가 곧이 문제를 해결합니다)

enter image description here 이것은 나의 palette.jpg입니다

enter image description here

:

원본 이미지는 여기 결과는 enter image description here

당신은 또한 색상에 따라 팔레트를 만들 수 있습니다 ImageMagick을 사용하여.

#/bin/bash 
cat<<EOF | convert txt:- palette.png 
# ImageMagick pixel enumeration: 8,2,256,rgb 
0,0: (255,255,255) 
1,0: (0,0,0) 
2,0: (0,0,255) 
3,0: (255,255,0) 
4,0: (255,0,0) 
5,0: (128,128,128) 
6,0: (255,105,180) 
7,0: (173,216,230) 
0,1: (50,205,50) 
1,1: (139,0,0) 
2,1: (255,165,0) 
3,1: (128,0,128) 
4,1: (0,0,139) 
5,1: (0,128,128) 
6,1: (0,128,0) 
7,1: (211,211,211) 
EOF 

기본적으로 스크립트가 위의 RGB 값으로 ImageMagick이 있습니다 : 나는이 다음과 당신은 그들이 올바른 가정 전에 여기에서 RGB 값을 확인하고 싶은 것, 그래서 너무 많은 관심을 지불하지 않은 것은 손으로 코딩

enter image description here

그런 다음 당신이 당신의 remap 조작으로이 팔레트를 사용합니다 : 텍스트는 다음과 같습니다 작은와 연동하여 이미지를 만들기 위해 요청합니다.

관련 문제