2009-08-17 2 views
8

투명 비트 맵에 앤티 엘리 어싱 된 텍스트를 그리고 알파 블렌딩 픽셀로 그려진 앤티 엘리 어싱을 사용하고 싶습니다. 이 방법으로 비트 맵을 모든 색상 표면 (또는 이미지)에 그릴 수 있으며 앤티 엘리 어싱은 여전히 ​​멋지게 보입니다. 여기 투명 비트 맵에서 앤티 엘리 어싱 된 텍스트

는 단순화 된 샘플은 문제를 보여주고있다 :

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    Bitmap bitmap = new Bitmap(this.Width, this.Height); 
    Graphics g = Graphics.FromImage(bitmap); 
    g.Clear(Color.Empty); 
    g.DrawString("hello world", new Font(this.Font.FontFamily, 24), Brushes.Blue, new Point(50, 50)); 
    e.Graphics.DrawImage(bitmap, new Point(0, 0)); 
} 

을 그리고 여기 결과입니다

alt text http://img194.imageshack.us/img194/9065/captureotd.png

이것의 궁극적 인 목표는 내 투명 알파 혼합 그릴 UpdateLayeredWindow 사용하는 것입니다 창문. 나는 Conky와 유사한 응용 프로그램을 만들고 있는데, ClearType 렌더링을 텍스트에 사용할 수 있기를 원합니다. (물론 앤티 엘리 어싱 없이는 쉽습니다.)

현재 양식 뒤에 화면을 가져 와서 그려 내 텍스트를 그립니다. 그것은 좋아 보이지만 업데이 트해야하고 그릴 느립니다. 데스크탑에서 텍스트 그리기를 수행하는 다른 아이디어도 환영합니다.

답변

15

ClearType 하위 픽셀 앤티 앨리어싱 모드가 활성화되어 있기 때문에 텍스트가 그대로 표시됩니다 (Vista 이상에서는 기본값 임). ClearType은 정의에 따라 알파 채널과 잘 어울리지 않습니다. 왜냐하면 색상을 혼합하기 때문에 배경을 인식하지 못하기 때문입니다. 따라서 알파 채널을 무시하고 검은 색으로 혼합됩니다 (그렇지 않으면 투명한 색입니다).

g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; 
+0

잘 돌아갔습니다. 고마워요! ClearType만큼 예쁘지는 않지만 ClearType (예 : Consolas) 용으로 설계된 글꼴조차도 괜찮아 보입니다. – iano

+0

궁금해서, 나를 위해'AntiAliasGridFit'는 앤티 앨리어스가 0 인 텍스트를 생성합니다. 그러나'AntiAlias'는 효과가 있습니다. –

+0

글꼴 크기가 너무 작 으면'AntiAliasGridFit'가 에일 리어 징 제거를하지 않을 수도 있습니다. 그러한 글꼴 크기에서,'AntiAlias'는 어쨌든 추한 결과를냅니다. –

1

내가 정말 필요하다면 모르겠지만, 당신은 알파 블렌딩을 수행하려는 경우, 32 비트 이미지를 지정해야합니다 : 귀하의 예제를 사용

Bitmap bitmap = new Bitmap(this.Width, this.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

을, 나는 할 수 있었다 텍스트는 텍스트 렌더링 힌트를 추가하여보기 흉합니다.

g.Clear(Color.Empty); 
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 
g.DrawString("hello world", new Font(this.Font.FontFamily, 24), Brushes.Blue, new Point(50, 50)); 

원하는대로하거나 숨기고 있습니까?

+3

'Bitmap'의'PixelFormat'을 생략하면 기본값으로 Format32bppArgb가됩니다. –