用GFL SDK做图片合并

本文介绍了如何利用GFL SDK这个强大的图形图像处理库,将多个PNG图片合并成一个带有Alpha通道的PNG文件。在无法使用XnView完成此任务的情况下,作者选择了自己编写代码来实现这一功能,并提供了示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

"GFL SDK is a powerfull library for developers who would like to support graphics image formats easily. "

GFL SDK 是免费看图软件 xnview 提供的一个库,可以在其主页(www.xnview.com) 下载.

前段时间看见一些漂亮的图标,于是就想给le换换图标,做好了各个按钮的图标后需要将其横排着合并为一个图片,在往常我是用xnview来合并的,但这次是要合并为带alpha通道的png文件,xnview怎样都做不到,合并后alpha通道都消失了.于是寻找其他工具,结果是未找到,难道要用ps手动的拼起来,如果只做一次合并还好,以后修改后还要再拼,太麻烦了,对于我此等懒人,还是算了.于是寻思着,自己写一个吧.

png格式的我不懂,要看懂也麻烦,用现成的库吧,于是想到了这个xnview提供的 GFL SDK. 好了,废话少说,上代码

' ---------------------------------------------------------------------------------------
'
 Procedure : SaveCombine
'
 DateTime  : 2007-5-8 21:05
'
 Author    : lingll
'
 email     : lingll_xl@163.com
'
 Purpose   : 生成合并文件,horizontal指定是按水平方向对齐排列还是垂直方向
'
---------------------------------------------------------------------------------------
'
Private   Function SaveCombine(sDestFile$, sSrcFiles() As String, horizontal As BooleanAs Boolean


Dim tBmp_bg As GFL_BITMAP, tPtBmp_bg&
Dim tBmp_src As GFL_BITMAP

Dim tClr As GFL_COLOR
Dim tsave As GFL_SAVE_PARAMS
Dim trc As GFL_RECT

Dim ub&, lb&, i&
Dim tW&, tH&, tCX&, tCY&

trc.x 
= 0: trc.y = 0

ub 
= UBound(sSrcFiles)
lb 
= LBound(sSrcFiles)




gflLibraryInit
gflEnableLZW 
True

Call MeasureCombinedImage(sSrcFiles, horizontal, tW, tH)

tPtBmp_bg 
= gflAllockBitmap(GFL_ARGB, tW, tH, 4, tClr)
extGetGflBitmapFromPtr tPtBmp_bg, tBmp_bg


If horizontal Then
    
For i = lb To ub
        tBmp_src 
= GetGlfBmp(sSrcFiles(i))
        trc.w 
= tBmp_src.Width
        trc.h 
= tBmp_src.Height
        
        
Call gflBitbltEx(tBmp_src, trc, tBmp_bg, tCX, 0)
        tCX 
= tCX + tBmp_src.Width
        gflFreeBitmapData tBmp_src
    
Next i
Else
    
For i = lb To ub
        tBmp_src 
= GetGlfBmp(sSrcFiles(i))
        trc.w 
= tBmp_src.Width
        trc.h 
= tBmp_src.Height
        
        
Call gflBitbltEx(tBmp_src, trc, tBmp_bg, 0, tCY)
        tCY 
= tCY + tBmp_src.Height
        gflFreeBitmapData tBmp_src
    
Next i
End If


gflGetDefaultSaveParams tsave

tsave.FormatIndex 
= gflGetFormatIndexByName("png")

gflSaveBitmap sDestFile, tBmp_bg, tsave

gflFreeBitmapData tBmp_bg


gflLibraryExit


End Function


' ---------------------------------------------------------------------------------------
'
 Procedure : MeasureCombinedImage
'
 DateTime  : 2007-5-8 21:14
'
 Author    : lingll
'
 email     : lingll_xl@163.com
'
 Purpose   : 计算合并后的图象长宽要多少
'
---------------------------------------------------------------------------------------
'
Private   Function MeasureCombinedImage( _
        sFiles() 
As String, horizontal As Boolean, cx&, cy&As Long
Dim tInf As GFL_FILE_INFORMATION
Dim ub&, lb&, i&
ub 
= UBound(sFiles)
lb 
= LBound(sFiles)

If horizontal Then
    
For i = lb To ub
        
Call gflGetFileInformation(sFiles(i), -1, tInf)
        
If tInf.Height > cy Then cy = tInf.Height
        cx 
= cx + tInf.Width
        gflFreeFileInformation tInf
    
Next i
Else
    
For i = lb To ub
        gflGetFileInformation sFiles(i), 
-1, tInf
        
If tInf.Width > cx Then cx = tInf.Width
        cy 
= cy + tInf.Height
        gflFreeFileInformation tInf
    
Next i
End If
End Function


' ---------------------------------------------------------------------------------------
'
 Procedure : GetGlfBmp
'
 DateTime  : 2007-5-8 20:35
'
 Author    : lingll
'
 email     : lingll_xl@163.com
'
 Purpose   : 加载图象
'
---------------------------------------------------------------------------------------
'
Private   Function GetGlfBmp(sFile$) As GFL_BITMAP
Dim tBmp_src As GFL_BITMAP, tPtBmp_src&

Dim tLoad As GFL_LOAD_PARAMS
Dim GflInfo As GFL_FILE_INFORMATION


gflGetDefaultLoadParams tLoad
tLoad.ColorModel 
= GFL_ARGB

gflLoadBitmapAny sFile, tPtBmp_src, tLoad, 
ByVal 0

extGetGflBitmapFromPtr tPtBmp_src, tBmp_src

GetGlfBmp 
= tBmp_src
End Function

用法与例子,将程序目录下的01.png-16.png水平合并为 all.png

Dim  tfiles( 1   To   16 As   String
Dim  i &

For  i  =   1   To   16
tfiles(i) 
=  App.Path  &   "/ "   &   Format (i,  " 0# " &   " .png "
Next  i

Call  SaveCombine(App.Path  &   " all.png " , tfiles,  True )

lingll
lingll_xl@163.com
http://blog.youkuaiyun.com/lingll/
2007-5-10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值