버그 해결을 위한 모든 질문을 던져
0 votes
387 views

CStatic *m_pWndText ;

m_pWndText = new CStatic;

m_pWndText->Create(_T("Click a button to change my color"), WS_CHILD | WS_VISIBLE | SS_LEFT,

CRect(0, 0, 500, 100), this);

 

이렇게 동적으로 생성했는데요, 

 

"Click a button to change my color"이 Text를 Cimage 형태로 변환하고 싶어요 

(물론 이미지의 크기도 CStatic크기와 같도록 만들고 싶어요)

 

간단히 말하면 text를 png형태로 변환하고 싶은데 방법이 있을까요?

asked (15 point) , 387 views

1 답변

0 votes
우수 답변
const char* szText = "Click a button to change my color";

int width = 500;
int height = 100;
RECT rc = { 0, 0, width, height };
COLORREF colorText = RGB(255, 255, 0);
COLORREF colorBack = RGB(0, 0, 255);

CImage image;
image.Create(width, height, 24);
HDC dc = image.GetDC();
CDC* pdc = CDC::FromHandle(dc);
pdc->FillSolidRect(&rc, colorBack);

SetTextColor(dc, colorText);
DrawTextA(dc, szText, -1, CRect(rc), 0);
image.ReleaseDC();
answered (458 point)
선택됨
배경을 투명으로 하고 싶은데,

pdc->FillSolidRect(&rc, colorBack); 대신 pdc->SetBkMode(TRANSPARENT); 얘를 사용했는데,

배경이 검정으로 나오더라구요 이유를 알 수 있을까요

SetBkMode는 실제로 색을 칠하는 함수가 아니고요. 칠하기 옵션만 지정하는 거고요.

DrawTextA 함수 호출시에 적용됩니다.

SetBkColor 로 색상을 지정해 보시면 좀더 정확히 알 수 있을 겁니다.

음.. 그림판에서 Text를 추가하면 나오는 옵션과 비교해 보시면 이해가 쉬울 거 같네요.

그렇구나, 감사합니다 이해는 되었어요 

그런데 촘두님 말씀대로라면 SetBkMode(TRANSPARENT) 모드를 사용했으니 

배경이 투명색이 되어야 하는데, 검정색으로 보이는데.... 제가 잘못이해했나요..?

 

int w = 500;
            int h = 100;
            RECT rc = { 0, 0, w, h };
            COLORREF colorText = RGB(255, 0, 0);
            COLORREF colorBack = RGB(0, 255, 0);

            CImage image;
            image.Create(w, h, 24);
            HDC dca = image.GetDC();
            CDC* pdc = CDC::FromHandle(dca);

            //pdc->FillSolidRect(&rc, colorBack);

            SetTextColor(dca, colorText);
            pdc->SetBkMode(TRANSPARENT);    

            DrawTextA(dca, szText, -1, CRect(rc), 0);
            image.Save(_T("Test.png"), Gdiplus::ImageFormatPNG);
            image.ReleaseDC();

 

위 그림과 같이 나오네요 .. 배경을 투명하게 해야하는데 방법 없을까요 

 

 

image.TransparentBlt(hDC, 0, 0, 500, 100, RGB(0, 0, 0));

Draw 대신 키컬러는 그리지 않는 TransparentBlt 함수를 써보세요.
저번 그림과 똑같이 나오네요 ...

            const char* szText = "Click a button to change my color";

            int w = 500;
            int h = 100;
            RECT rc = { 0, 0, w, h };
            COLORREF colorText = RGB(255, 0, 0);
            COLORREF colorBack = RGB(0, 255, 0);
            COLORREF black = RGB(0, 0, 0);
            CImage image;
            image.Create(w, h, 24);
            HDC dca = image.GetDC();
            CDC* pdc = CDC::FromHandle(dca);

            //pdc->FillSolidRect(&rc, colorBack);

            SetTextColor(dca, colorText);
            pdc->SetBkMode(TRANSPARENT);
            image.TransparentBlt(dca, 0, 0, 500, 100, RGB(0,0,0));

            DrawTextA(dca, szText, -1, CRect(rc), 0);
            image.Save(_T("Test.png"), Gdiplus::ImageFormatPNG);
            image.ReleaseDC();

 

꼭 CImage가 아니더라도, 혹시

String를 png로 변환하는 방법없을까요?

 

자바스크립트를 예로 들면

canvas.toDataURL() 처럼

현재 캔버스를 png로 만들어주는 기능을 구현하고 싶거든요

TransparentBlt 함수는 특정 키컬러를 투명으로 처리해서 렌더링하는 함수이고요.

원하시는 게 MFC에서 바로 렌더링하는 게 아니라 png 파일로 저장하는 걸 원하시는 거 같은데...

그런거라면 프로그램적으로 이미지를 생성할 게 아니라, 포토샵 등 이미지 제작툴을 쓰시는 게 맞습니다.

무료로 쓸 수 있는 툴 중에는 Gimp 혹은 Painter.Net이라는 걸 추천드립니다.

해당 툴에서 문자열을 찍고, 알파채널 있는 png로 익스포트 하는 방법을 검색해 보시는 게 좋겠군요.

혹시, 스트링이 아니라 글자 하나하나를 이미지로 만들어 폰트처럼 쓰고 싶으시다면, "비트맵 폰트"라는 걸 찾아보시고요. 비트맵 폰트 만들어 주는 유틸리티와 소스는 아래의 링크를 참고해 보세요.

https://www.angelcode.com/products/bmfont/

그리고, 최종적으로 무엇을 하고 싶어하시는 건지 먼저 얘기해 주시면 답변 드리기가 쉬울 거 같은데, 아직도 질문의 의도가 뭔지 잘 모르겠군요.

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

242 질문
373 answers
379 댓글
475 users