找回密码
 加入
搜索
查看: 1906|回复: 1

[图形处理] 请各位看看关于图像旋转的这个代码有何问题?

[复制链接]
发表于 2016-6-9 20:23:25 | 显示全部楼层 |阅读模式
本帖最后由 vv3509 于 2016-6-9 20:53 编辑
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <winapi.au3>
If $CmdLine[0] = "" Then
        MsgBox(48, "注意", "本程序不需要直接运行" & @CRLF & "只要将需处理文件全选拖到程序图标即可", 5)
Else
        For $i = 1 To $CmdLine[0]
                IMAGE_FZ($CmdLine[$i], _getdir($CmdLine[$i]) & "" & _getfilename($CmdLine[$i]))   ;这一行出问题
        Next
EndIf
;~ IMAGE_FZ("1.jpg", "2.jpg")
;图片翻转90度
Func IMAGE_FZ($picpath, $fiename) ;入口文件,出口文件
        $nAngle = 90 ;翻转角度
        _GDIPlus_Startup()
        $hImage2 = _GDIPlus_ImageLoadFromFile($picpath)
        $iW = _GDIPlus_ImageGetWidth($hImage2)
        $iH = _GDIPlus_ImageGetHeight($hImage2)
        $hWnd = _WinAPI_GetDesktopWindow()
        $hDC = _WinAPI_GetDC($hWnd)
        $hBMP = _WinAPI_CreateCompatibleBitmap($hDC, $iH, $iW)
        _WinAPI_ReleaseDC($hWnd, $hDC)
        $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)
        $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage1)
        $hMatrix = _GDIPlus_MatrixCreate()
        _GDIPlus_MatrixRotate($hMatrix, $nAngle, "False")
        _GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix)
        _GDIPlus_GraphicsDrawImage($hGraphic, $hImage2, 0, 0 - $iH)
        _GDIPlus_MatrixDispose($hMatrix)
        $CLSID = _GDIPlus_EncodersGetCLSID("BMP")
        _GDIPlus_ImageSaveToFileEx($hImage1, $fiename, $CLSID)
        _GDIPlus_ImageDispose($hImage1)
        _GDIPlus_ImageDispose($hImage2)
        _GDIPlus_GraphicsDispose($hGraphic)
        _WinAPI_DeleteObject($hBMP)
        _GDIPlus_Shutdown()
EndFunc   ;==>IMAGE_FZ
Func _getdir($spath)
        If StringRegExp($spath, '\\') Then
                $sdir = StringRegExpReplace($spath, '\\[^\\]*单独的 IMAGE_FZ("1.jpg", "2.jpg") 运行没问题 但是改成上面的批量处理就没反应了, '')
        Else
                $sdir = ''
        EndIf

        Return ($sdir)
EndFunc   ;==>_getdir
Func _getfilename($spath, $sflag = 0)
        If $sflag = 0 Then
                $sflag = 0
        Else
                $sflag = 1
        EndIf
        If $sflag = 0 Then
                $sFileName = StringRegExpReplace($spath, '.+\\', '')
        Else
                $sFileName = StringRegExpReplace($spath, '.+\\', '')
                $sFileName = StringRegExpReplace($sFileName, '\.[^\.]*单独的 IMAGE_FZ("1.jpg", "2.jpg") 运行没问题 但是改成上面的批量处理就没反应了, '')
        EndIf
        Return ($sFileName)
EndFunc   ;==>_getfilename
Func _getfiletype($spath)
        $sFiletype = StringRegExpReplace($spath, '.+\.', '')
        Return ($sFiletype)
EndFunc   ;==>_getfiletype
第6-12行:运行没反应
单独运行13行的 IMAGE_FZ("1.jpg", "2.jpg") 就没问题



用官方论坛的这个代码解决:
Global $hBitmap, $hImage, $hImage, $sCLSID, $tData, $tParams, $nAngle = 1 ;翻转角度
If $CmdLine[0] = "" Then
        MsgBox(48, "注意", "本程序不需要直接运行" & @CRLF & "只要将需处理文件全选拖到程序图标即可", 5)
Else
        For $i = 1 To $CmdLine[0]
                IMAGE_FZ($CmdLine[$i], _getdir($CmdLine[$i]) & "" & _getfilename($CmdLine[$i]), $nAngle)
        Next
EndIf
Func IMAGE_FZ($picpath, $fiename, $nAng)
        _GDIPlus_Startup()
        $hImage = _GDIPlus_ImageLoadFromFile($picpath)
        _GDIPlus_ImageRotateFlip($hImage, $nAng)
        _GDIPlus_ImageSaveToFile($hImage, $fiename)
        _GDIPlus_ImageDispose($hImage)
        _GDIPlus_ImageDispose($hImage)
        _GDIPlus_Shutdown()
EndFunc   ;==>IMAGE_FZ
Func _getdir($spath)
        If StringRegExp($spath, '\\') Then
                $sdir = StringRegExpReplace($spath, '\\[^\\]*, '')
        Else
                $sdir = ''
        EndIf

        Return ($sdir)
EndFunc   ;==>_getdir
Func _getfilename($spath, $sflag = 0)
        If $sflag = 0 Then
                $sflag = 0
        Else
                $sflag = 1
        EndIf
        If $sflag = 0 Then
                $sFileName = StringRegExpReplace($spath, '.+\\', '')
        Else
                $sFileName = StringRegExpReplace($spath, '.+\\', '')
                $sFileName = StringRegExpReplace($sFileName, '\.[^\.]*, '')
        EndIf

        Return ($sFileName)
EndFunc   ;==>_getfilename
Func _getfiletype($spath)
        $sFiletype = StringRegExpReplace($spath, '.+\.', '')
        Return ($sFiletype)
EndFunc   ;==>_getfiletype
但还是想知道上面那个代码为什么不行?
发表于 2016-6-16 10:08:32 | 显示全部楼层
带参数运行啊,没参数当然不行
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-26 00:29 , Processed in 0.070355 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表