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. 지도에 넣을 때 결과를 캐시하면 매우 빠릅니다.
또한 원본 색상은 이미지에서 밴딩 및 일반 영역을 생성하지 않고 세부 묘사가되지 않을 정도로 팔레트 색상에 거의 맞지 않습니다. 이를 방지하기 위해 디더링을 사용할 수 있습니다. 가장 간단한 알고리즘과 최상의 결과를 제공하는 알고리즘은 오차 확산 디더링입니다.
일단 색을 매핑하면 비트 맵을 수동으로 잠그고 그 안에 색인을 작성해야합니다. 닷넷은 색인 된 이미지에 쓸 수 없도록합니다.
+1, 좋은 질문! –