2014-01-21 1 views
0

Моя проблема: если я нарисую текст непосредственно на CImage, ранее загруженном из файла .PNG. сам текст прозрачен (вы можете видеть цвет фона через него), и нет способа получить желаемый цвет.Установите цвет текста при рисовании непосредственно на CImage, загруженном из .png

CImage image; 
image.Load ("myimage.png") ; 

//Draw some text 
HDC dc = image.GetDC(); 
SetTextColor (dc, RGB(0 , 0 , 0)); ///< I think the problem is here 
DrawText (dc, "Hello world!", -1, CRect (0 , 0 , 200 , 200), 0); 
image.ReleaseDC(); 

//Render of the image somewhere 
image.Draw (someOutDC , 0 , 0); 

Я пробовал разные значения RGB и .PNG с прозрачным цветом или без него, но с таким же результатом. Только если я загружаюсь из .BMP или .JPG, он работает (но мне нужен .PNG). Есть что-то о .PNG, но я понятия не имею, как правильно установить цвет текста.

Я забыл сказать, что я также попробовал Альфа RGB, как это:

SetTextColor (dc , RGB (0,0,0) + 255 << 24); 

... но ничего изменить ... какие-нибудь предложения?

+1

Это звучит как CImage делает 32bit DIB из файла PNG. К сожалению, функции GDI для рисования текста (полезно) управляют 24 битами RGB - они устанавливают 8 альфа-бит в 0. Решение состоит в использовании функций рисования текста GDI +, которые работают с полными 32 битами. – enhzflep

+0

Я думаю, что вы правы, я собираюсь исследовать, как это сделать. – prompt

+0

Вот и все, я использовал GDI + и отлично работает. Мне жаль, что мой счет слишком низок, что я не могу отвечать за себя до завтра. – prompt

ответ

1

Как @enhzflep сказал, GDI не может обрабатывать альфа-канал правильно, чтобы при работе с 32 BPP изображение, которое вы должны использовать GDI + функциональность, как это:

#include <GdiPlus.h> 
#pragma comment(lib,"gdiplus.lib") 

//.... 

Gdiplus::Graphics graphics (image.GetDC()); 
Gdiplus::Font font (&FontFamily (L"Arial"), 10); 
Gdiplus::SolidBrush brush (Color (255, 0, 0, 0)); 
graphics.DrawString (L"Hello world", -1, &font, PointF(0.0f, 0.0f), &brush); 
image.ReleaseDC() 
0

Вам необходимо установить BkMode на TRANPARENT CDC::SetBkMode. Таким образом, цвет текста используется для рисования символов, а фон прозрачен.

Рисование PNG прозрачным с альфа-каналом с GDI невозможно. Вы можете сделать это с помощью GDI +. Смотрите образец here

+0

SetBkMode предназначен для текста, а не для самого текста, а CImage - для альфа-канала. Я думаю, что @enhzflep понял. – prompt

+0

ОК. Извините, но я пропустил этот вопрос. – xMRi