c\c++ 控制台应用程序开发 gdi++

gdi+一般用到mfc或win32程序中,网上的例子很多,这里使用的是控制台应用程序

    加载头文件

            #include <GdiPlus.h>

            #pragma comment(lib, "gdiplus.lib")

            using namespace Gdiplus;

    1.初始化gdi+

                GdiplusStartupInput gdiplusStartupinput;
                 ULONG_PTR gdiplusToken;
                 GdiplusStartup(&gdiplusToken,&gdiplusStartupinput,NULL);

    2.关闭gdi+(这句在程序的最后,因为start和shutdown是成对出现的,所以一块说了)

                GdiplusShutdown(gdiplusToken);

    3.中间是自己的程序

                我用的是将文字按照格式要求绘制到图片中保存或是得到图片的数据,只用到gdi+中的入门知识

                1). 建立bitmap对象,用作绘制的对象

                        Bitmap bmp(/*宽*/, /*高*/, ...);

                2). 字体格式

                        wchar_t fontname[ ] = L"Arial";

                        FontFamily ff(format);

                        wchar_t text[ ] = L"abc123哥的爱家";

                        StringFormat sf;

                        GraphicsPath gp;
                        gp.AddString(text,wcslen(words),&ff,0,90,Point(0,0),&sf);

                        

                        Graphics *gpbmp=Graphics::FromImage((Image*)&bmp);
                        gpbmp->SetSmoothingMode(SmoothingModeAntiAlias);//抗锯齿

 

                        Pen pen(Color(255,0,0,0),4);//outline
                        pen.SetLineJoin(LineJoinRound);

                        gpbmp->DrawPath(&pen,&gp);

 

                        SolidBrush sb(Color(255,0,255,0));//text

                        gpbmp->FillPath(&sb,&gp);

                        /*还可以绘制阴影,跟text是同样的方法*/

 

                        /*简单的就完成了,可以保存了*/

                        CLSID pngClsid;

                        /*GetEncoderClsid需要自己实现,将在下面给出*/
                        /*"image/bmp" 参数bmp是要保存的图片格式,可以换成png,jpeg等*/

                        GetEncoderClsid(L"image/bmp", &pngClsid);
                        bmp.Save(L"c:\\test.bmp", &pngClsid, NULL);

 

                        /*下面的方法是将bmp转换成unsigned char*        */

                        void * outbuf;
                        size_t size = 0;
                        mi_to_memory( &bmp, &outbuf,  &size );

 

                        /*

                        *outbuf即为bmp转化成的字符串,可以使用里面的数据,png是压缩过的,只能用bmp格式,其中文件的前54位是图

                        *片的格式信息,从55位开始是图片的数据信息,里面的数据可能不是按正常顺序排列的,有的是从上往下一行一行

                        *正常排列,有的是从下往上排列,在图片的格式信息中有标记。

                        */

                         

                        /*下面是用得到函数*/ 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
int GetEncoderClsid( const WCHAR * format, CLSID* pClsid)
{
  UINT num= 0;
  UINT size= 0;
  
  ImageCodecInfo* pImageCodecInfo= NULL;
  
  GetImageEncodersSize(&num, &size);
  if (size== 0)
  {
   return -1;
  }
  pImageCodecInfo= (ImageCodecInfo*)( malloc (size));
  if (pImageCodecInfo== NULL)
  {
   return -1;
  }
  
  GetImageEncoders(num, size, pImageCodecInfo);
  
  for ( UINT j=0; j< num; ++j)
  {
   if (wcscmp(pImageCodecInfo[j].MimeType, format)== 0)
   {
    *pClsid= pImageCodecInfo[j].Clsid;
    free (pImageCodecInfo);
    return j;
   }
  }
  
  free (pImageCodecInfo);
  return -1;
}
  
static bool stream_to_mem( IStream *stream, void **outbuf, size_t *size )
{
  ULARGE_INTEGER ulnSize;
  LARGE_INTEGER lnOffset;
  lnOffset.QuadPart = 0;
  /* get the stream size */
  if ( stream->Seek( lnOffset, STREAM_SEEK_END, &ulnSize ) != S_OK )
  {
   return false ;
  }
  if ( stream->Seek( lnOffset, STREAM_SEEK_SET, NULL ) != S_OK )
  {
   return false ;
  }
  
  /* read it */
  *outbuf = malloc ( ( size_t )ulnSize.QuadPart );
  *size = ( size_t ) ulnSize.QuadPart;
  ULONG bytesRead;
  if ( stream->Read( *outbuf, ( ULONG )ulnSize.QuadPart, &bytesRead ) != S_OK )
  {
   free ( *outbuf );
   return false ;
  }
  
  return true ;
}
  
void *mi_to_memory( Gdiplus::Image *image, void **outbuf, size_t *size )
{
  IStream *stream = NULL;
  if ( ::CreateStreamOnHGlobal( NULL, TRUE, &stream ) != S_OK )
  {
   return NULL;
  }
  /* get the jpg encoder */
  ::CLSID jpgClsid;
  GetEncoderClsid( L "image/bmp" , &jpgClsid );
  
  /* save the image to stream */
  Gdiplus::Status save_s = image->Save( stream, &jpgClsid );
  if ( save_s != Gdiplus::Ok )
  {
   stream->Release();
   return NULL;
  }
  
  /* read the stream to buffer */
  if ( !stream_to_mem( stream, outbuf, size ) )
  {
   stream->Release();
   return NULL;
  }
  return *outbuf;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值