tangqinfei 发表于 2011-10-28 04:02:47

【已解决】GDI图片上的文字处理

本帖最后由 tangqinfei 于 2011-10-29 22:13 编辑

能不能把公告内容里的所有文字都在图片上显示出来。#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>;内嵌GDI+的UDF,以供程序调用GDI+
$path = @ScriptDir & "\公告内容.txt";设置变量
$Read = FileRead($path,FileGetSize($path));从此前已打开的文本文件中读取指定数量的字符

Global Const $BMPCLSID = '{557CF400-1A04-11D3-9A73-0000F81EF32E}';指定BMP的图像编码器,测试N次为个值是固定的,所以直接用,大家也可以用_GDIPlus_EncodersGetCLSID('BMP')
Global Const $JPGCLSID = '{557CF401-1A04-11D3-9A73-0000F81EF32E}';同上
_GDIPlus_Startup();启动GDI+
$hImage = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\bg.jpg");从文件中创建一个位图对象
$w = _GDIPlus_ImageGetWidth($hImage);返回图像对象的宽度
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage);获取刚刚创建的位图对象的图形句柄
_GDIPlus_GraphicsSetSmoothingMode($hGraphic,2);设置图形的平滑度,使图形的图像有抗锯齿功能
DllCall($ghGDIPDll, "int", "GdipSetTextRenderingHint", "hwnd", $hGraphic , "int", 4);设置字体的平滑度,使图形的文字有抗锯齿功能,谢谢The886研究出来!
$hBrush = _GDIPlus_BrushCreateSolid(0xffff00ff);创建实心画笔对象,其中Alpha通道值为255,RGB值为0xff00ff
$hFormat = _GDIPlus_StringFormatCreate();创建字符串格式对象
$hFamily = _GDIPlus_FontFamilyCreate("微软雅黑");创建字体为"微软雅黑"的字体族对象
$hFont = _GDIPlus_FontCreate($hFamily, 12, 1);用上面创建的字体族创建一个字体大小为20,粗体+斜体,坐标参照为像素的字体对象,坐标参照很重要,会影响到字体在图形上的位置
$tLayout = _GDIPlus_RectFCreate(50, 45, 0, 0);创建 $tagGDIPRECTF 数据结构
$string = $Read;定义字符串

$aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $string, $hFont, $tLayout, $hFormat);根据上面创建的字体、字符串等信息测量字符串在图形中的尺寸,以便在图形中绘制
$Dwitdh = DllStructGetData($aInfo, "Width");获取上面创建的文本在图形中占用的宽度
ConsoleWrite($Dwitdh & @CRLF)
$xx = ($w - $Dwitdh)/2;文本居中后的X坐标
DllStructSetData($aInfo, "X", $xx);设置文本居中后的X坐标
;~ DllStructSetData($aInfo, "Y", $yy);设置文本居中后的Y坐标
_GDIPlus_GraphicsDrawStringEx($hGraphic, $string, $hFont, $aInfo, $hFormat, $hBrush);在图形中绘制上面创建的字符串对象
_GDIPlus_ImageSaveToFileEx($hImage, @ScriptDir & "\aa.bmp",$BMPCLSID,0);把位图对象保存为BMP文件
_GDIPlus_GraphicsDispose($hGraphic);释放资源
_WinAPI_DeleteObject($hImage);释放资源
_GDIPlus_Shutdown();关闭GDI+

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 545, 300, 192, 114)
$pic=GUICtrlCreatePic(@ScriptDir & "\aa.bmp",0,0,545,300)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit

        EndSwitch
WEnd

netegg 发表于 2011-10-28 04:38:33

#Include <GDIPlus.au3>
_GDIPlus_GraphicsSetSmoothingMode

hzxymkb 发表于 2011-10-28 06:23:27

回复 2# netegg


    蛋神这么早起床?

seniors 发表于 2011-10-28 07:50:43

没看懂问题

tangqinfei 发表于 2011-10-29 22:12:52

$hFont = _GDIPlus_FontCreate($hFamily, 12, 1);用上面创建的字体族创建一个字体大小为20,粗体+斜体,坐标参照为像素的字体对象,坐标参照很重要,会影响到字体在图形上的位置

修改这句把$hFont = _GDIPlus_FontCreate($hFamily, 12, 1,5)加上坐标参照5,我试了很多次,只有这个5才行,然后调整下字体大小就行了。

770317321 发表于 2011-11-1 13:28:01

好東西啊學習自己也研究下

zmdzhxj 发表于 2017-3-20 21:34:42

试验了一下,怎么不显示啊
页: [1]
查看完整版本: 【已解决】GDI图片上的文字处理