2009-11-05 3 views
6

전체 컬러 JPG 이미지를 가져 와서 색을 인덱스 팔레트로 다시 매핑해야합니다. 팔레트는 데이터베이스에서 채워지는 특정 색상으로 구성됩니다. 색인의 "가장 가까운"값에 이미지의 각 색상을 매핑해야합니다. 나는 "가장 가까운"값을 비교하고 계산하기위한 다른 알고리즘이 있다고 확신한다. C#, .NET 관리 코드 라이브러리 만 찾고 있습니다.32-BPP에서 8-BPP로 인덱스 변환 (C#)

(120 가지 이상의 특정 색상의 버튼이있는 프로세스에서 사용되며 콜라주를 만들기 위해 이미지를이 120 가지 색상으로 매핑하려고합니다.)

+0

+1, 좋은 질문! –

답변

2

이 프로세스를 Quantization이라고합니다. 각 색상은 3 개의 채워진 값을 나타내므로이 문제를 해결하려면 Octrees를 사용해야합니다.

예제 코드로 article을 확인하십시오.

이 기사에서는 이미지의 궁극적 인 팔레트를 가져 오는 데 중점을 둡니다.하지만 두 번째 부분에서는 역순으로 처리되며 주어진 팔레트에 가장 많이 사용되는 색상 만 줄입니다.

+0

.NET 프레임 워크는 Quantization 라이브러리를 내장하고 있습니까? –

+0

나는 .NET에 대해 알지 못했고 (Linux 녀석이다.) 나는 나 자신의 일을하는 데 익숙하다. 죄송합니다. 더 자세한 정보를 제공 할 수 없습니다. – LiraNuna

0

큰 .NET 프로젝트에서이 작업을 수행해야했습니다. 프레임 워크에는 아무 것도 없지만이 기사에서는 신속하게 해결책을 찾았습니다. http://codebetter.com/blogs/brendan.tompkins/archive/2004/01/26/6103.aspx

+0

링크가 작동하지 않습니다. –

+0

''을 (를) 삭제 한 것 같습니다. 그의 이름으로. 작동 방식 : http://codebetter.com/brendantompkins/2004/01/26/use-gdi-to-save-crystal-clear-gif-images-with-net/ – Nestor

0

JPEG 단어는 경고음을 울립니다. 이미 지나치게 양자화 된 색 공간에 이미지가있을 가능성이 높습니다. 추가 리샘플링을 수행하면 앨리어싱이 발생할 수 있습니다. 가능한 경우 압축되지 않은 이미지에서 작업하여이 효과를 줄이십시오.

질문에 대한 답은 예입니다. 대체 형식으로 이미지를 저장할 수는 있지만 네이티브 기능이 상당히 복잡한 요구 사항에 적합한 지 확실하지 않습니다. 이미지 모음에서 색상 표를 정의 할 수 있다면 출력의 품질을 향상시킬 수 있습니다.

'GIF +를 사용하여 Crystal-Clear GIF 이미지를 .NET에 저장'이라는 이미 참조 된 블로그 항목에는 유용한 코드 참조가 포함되어 있습니다.

3

GDI에 도움이되는 것은 없습니다. Microsoft는 색인 된 이미지가 너무 뒤 떨어진 기술인 것으로 보입니다. 인덱싱 된 이미지 파일을 읽고 쓰는 것만 가능합니다.

은 이미지의 양자화 색상 일반적으로 두 단계가 있습니다
1) 이미지에 가장 적합한 팔레트 (컬러 양자화)
2) 발견 된 팔레트 소스 solors지도 (컬러 맵핑)을 찾기

내가 이해하는 것으로부터, 당신은 이미 데이터베이스에 팔레트를 가지고있다. 그것은 당신을 위해 가장 어려운 부분이 완료되었음을 의미한다. 24 비트 색상을 제공된 팔레트 색상에 매핑하기 만하면됩니다. 시작 팔레트가없는 경우 양자화 알고리즘을 사용하여 직접 계산해야합니다. Octrees 또는 Median Cut이 가장 잘 알려져 있습니다. 미디어 컷 (Median Cut)은 더 나은 결과를 제공하지만 느리게 구현하고 미세 조정할 수 있습니다.

색상을 매핑하려면 가장 간단한 알고리즘은 소스 색상과 모든 팔레트 색상까지의 거리를 계산하고 가장 가까운 것을 선택하는 것입니다.파란색 적은 무게를 가질 수 있도록

float ColorDistanceSquared(Color c1, Color c2) 
{ 
    float deltaR = c2.R - c1.R; 
    float deltaG = c2.G - c1.G; 
    float deltaB = c2.B - c1.B; 
    return deltaR*deltaR + deltaG*deltaG + deltaB*deltaB; 
} 

또한, 특별히 30/59/11 전혀 작동하지 않습니다 그렇지 않으면 끔찍한 결과를 줄 것이다, 그것으로도 바다에 가지 마세요, 채널을 ponderate 수 있습니다

float ColorDistanceSquared(Color c1, Color c2) 
{ 
    float deltaR = (c2.R - c1.R) * 3; 
    float deltaG = (c2.G - c1.G) * 3; 
    float deltaB = (c2.B - c1.B) * 2; 
    return deltaR*deltaR + deltaG*deltaG + deltaB*deltaB; 
} 

모든 소스 및 팔레트 색상에 해당하는 것을 호출하고 Min. 지도에 넣을 때 결과를 캐시하면 매우 빠릅니다.

또한 원본 색상은 이미지에서 밴딩 및 일반 영역을 생성하지 않고 세부 묘사가되지 않을 정도로 팔레트 색상에 거의 맞지 않습니다. 이를 방지하기 위해 디더링을 사용할 수 있습니다. 가장 간단한 알고리즘과 최상의 결과를 제공하는 알고리즘은 오차 확산 디더링입니다.

일단 색을 매핑하면 비트 맵을 수동으로 잠그고 그 안에 색인을 작성해야합니다. 닷넷은 색인 된 이미지에 쓸 수 없도록합니다.