2013-10-07 7 views
4

고기

C 또는 C++에서 색상 표 RGB 값을 직접 읽을 수있는 방법이 있습니까? 특히 흥미로운 점은 xterm (및 다른 사람들)이 최대 256 개의 터미널 색상을 정의하는 데 사용하는 확장 색상 공간입니다.콘솔 색상 표의 RGB 값 읽기

감자

점에서이 사건은 내가 (또는 직접 C에서, \e]4;3;rgb:cc/78/33\e\\처럼, ANSI 이스케이프 시퀀스를 사용하여) 내 자신의 색상을 정의 할 수 있다는 것입니다하지만 난에 (내가 그들을 다시 정의하기 전에 사용자 색상을 저장해야 드물게 이미 색상을 재정의 한 경우) 프로그램을 마칠 때 복원 할 수 있습니다. Clobbering 사용자 설정이 좋지 않습니다.

지금 당장 클라이언트 측에서 ANSI 이스케이프 시퀀스를 사용하려고합니다. 하지만 어떻게하면 색상을 얻지 못하는지 알기 때문에 대신 C 또는 C++에서이 작업을 수행하기 시작합니다.

솔루션은 네이티브 확장 (기본적으로 c 또는 C++ 코드 포함)이 포함 된 루비 보석으로 작성되며 주요 대상은 OS X 및 두 번째 Linux 환경 임에도 불구하고 크로스 플랫폼 솔루션을 얻으려고합니다. .. 나는 내가 색상 팔레트의 코드 포인트 원하는 색상을 정의 할 수있는 지점에 입수했습니다 내 초기 실험에서

Sause

. 또한 기본 시스템 색상을 쉽게 복원 할 수 있습니다 (ANSI 표준이므로). ANSI 이스케이프 코드에서이 작업을 수행하는 방법에 대해 높게 평가했지만 아무 것도 발견하지 못했습니다. 나는이 어딘가에 메모리에 보관하고

지금까지 의견의 정보를 요약하는 위치, 색상을 읽는 것은 쉽게해야 찾을 수있는 방법 ...

디저트가있는 경우 있는지 파악 :

이 작업을 일관되게 수행하는 유일한 방법은 █ 문자 화면을 다른 색상으로 인쇄하고 그 색상을 잡는 것입니다. 이 프로젝트는 세 가지 주요 OS에 대한 크로스 플랫폼으로되어 있고 Linux는 현재 사용자가 3 명의 디스플레이 관리자를 사용하고 있기 때문에 Windows에 두 개 (7-8 개)의 사용이 가능하므로 그 시간과 시간을 상상할 수 있습니다. :)

내 "솔루션"™은 사용자의 색상을 그냥 긁어 모으는 것입니다. (시스템 기본값 이외의 것이 있으면 ... 매우 드문 경우입니다). 나는 사용자가 시스템 기본값에 만족하지 않으면 어떤 색을 복원해야하는지 플러그인에게 알릴 수있는 설정 파일을 제공 할 것이다. 실용적이고 지루하지만, 그것은 나를 다시가는 :)의 취득

+0

어리석은 질문을하지만 일부 SO 주위를 둘러 보았다 있습니다 관련 질문? [예를 들어] (http://stackoverflow.com/questions/2659932/how-to-read-the-screen-pixels),이 하나는 지역 또는 전체 화면을 가져 오는 방법에 대한 여러 가지 변형을 설명합니다. [: GetPixel] (http://stackoverflow.com/a/2970056/645128)과 같은 것을 사용하면 효과가 있을까? – ryyker

+0

나는 SO 및 SuperUser 등에서 찾을 수있는 모든 관련 질문을 읽었습니다. 여기서 문제는 콘솔 컨텍스트에서 픽셀 값을 얻는 것이 그래픽 환경을 사용하지 않아도되는 옵션이 아닐 수 있다는 것입니다. 내가 정말로 원했던 것은 이스케이프 시퀀스 또는 메모리의 색상 표에 직접 액세스하는 방법이었습니다. 솔기가 가능하지는 않습니다./ –

답변

0

[편집 1] 유감이 없습니다 솔루션을하지만 난 IO 액세스 DAC 팔레트를 추가

이전 기존 EGA/VGA를 보면 다른 사람에 대한 리드 참조 ...

  • 는 I/O
  • 을 통해 팔레트에 액세스 할 수 있습니다 내가 그것을 0x03C8, 0x03C9 육각 포트이었다 생각합니다.
  • 물론 현대 OS에서는 액세스 할 수 없습니다.
  • DOS-BOX에서 시도해 보시거나 이전 팔레트 값을 저장하십시오. 동일해야합니다.

직접 접근이 시도 :

BYTE r,g,b,c=5; // R,G,B values are 6 bit only !!! 
out 0x3C8,c; // set color index to work with <0,255> 
in r,0x3C9; // read color pallete for color c 
in g,0x3C9; // not sure if it should be r,g,b 
in b,0x3C9; // or b,g,r ... i did not use it for too many years 
out 0x3C8,c; // set color index to work with <0,255> 
out 0x3C9,r; // write color pallete for color c 
out 0x3C9,g; 
out 0x3C9,b; 

C/C++ 작업이 너무이 사용에서,에서가 없습니다 :

BYTE i,o;  // this must be local !!! 
WORD port;  // this must be local !!! 
asm { 
    mov dx,port // in i,port 
    in al,dx 
    mov o,al 

    mov dx,port // out port,o 
    mov al,o 
    out dx,al 
    } 
+0

질문에서 지적한 것처럼 단순히 시스템 기본값을 복원하는 것이 아니라 사용자 색상을 유지하는 것입니다. 기본 설정의 정적 맵을 얻는 것은 쉽습니다 :) –

+0

EGA/VGA에 대한 IO 액세스를 사용하면 대부분의 콘솔이 일반적으로 작동하는 256 색 팔레트에서 개별적으로 색상을 가져오고 설정할 수 있습니다. 유일한 질문은 당신이 입출력을 가지고 있는지 아닌지 ... – Spektre

+0

추신. 팔레트는 gfx 카드에 저장되어 CPU가 아닌 메모리 공간에 저장되므로 원하는 메모리 접근이 가능합니다 ... 콘솔이 텍스트 모드가 아니라면 여전히 256 컬러 EGA/VGA 모드를 에뮬레이션해야합니다. 그렇지 않다면 콘솔이 아니라 에뮬레이션과 유일한 방법은 이전에 스크린의 GetPixel (스크린이 아니라 윈도우 !!!)입니다. 이 경우 256 색을 다른 색상으로 쓰고 글꼴 색을 읽으십시오 (앤티 앨리어싱으로 인해 필터링을 추가해야합니다) – Spektre