找回密码
 加入
搜索
查看: 5721|回复: 15

[系统综合] 如何判断图片文件是否损坏?【已解决】

  [复制链接]
发表于 2017-5-2 23:54:29 | 显示全部楼层 |阅读模式
本帖最后由 fenhanxue 于 2017-5-4 12:27 编辑

有大量的   .jpg 图片,其中,部分的图片是损坏掉的,即无法正常打开,请教如何借助au3判断一个图片文件是否已经损坏?

损坏的图片,双击打开是这样的:





我能想到的有这样两种判断方法,但是肯定有更高效的判断方法吧?
Local $pic = '我是一张不能正常打开的图片.jpg'
;我自己能想到的办法1:
$Form1 = GUICreate("Form1", 346, 244, 192, 114)
$Pic1 = GUICtrlCreatePic($pic, 48, 40, 129, 145)
If $Pic1 = 0 Then
        MsgBox(0,'','图片损坏')
Else
        MsgBox(0,'','图片未损坏')
EndIf

;办法2
#Include <GDIPlus.au3>
  _GDIPlus_Startup()
$test = _GDIPlus_ImageLoadFromFile($sFileName)
If $test = -1 Then
        MsgBox(0,'','图片损坏')
Else
        MsgBox(0,'','图片未损坏')
EndIf
_GDIPlus_Shutdown()

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2017-5-3 07:51:40 | 显示全部楼层
把损坏的jpg打包上来几个
 楼主| 发表于 2017-5-3 09:35:00 | 显示全部楼层
回复 2# haijie1223

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2017-5-3 10:52:27 | 显示全部楼层
回复 3# fenhanxue
#include <GDIPlus.au3>
Local $ImageFile = @ScriptDir & '\2.jpg'
_GDIPlus_Startup()
Local $hImage = _GDIPlus_ImageLoadFromFile($ImageFile)
Local $ImageType = _GDIPlus_ImageGetRawFormat($hImage)
_GDIPlus_Shutdown()
If Not $ImageType[1] Then
        ConsoleWrite('文件损坏' & @CRLF)
Else
        ConsoleWrite($ImageType[1] & @CRLF)
EndIf
发表于 2017-5-3 14:38:07 | 显示全部楼层
回复 4# haijie1223


    读取文件格式  读取错误就是损坏  那文件多怎么测试
发表于 2017-5-3 18:04:13 | 显示全部楼层
回复 5# cfanpc


    文件再多也是这么测试。。。和文件多少有什么关系
 楼主| 发表于 2017-5-3 22:08:48 | 显示全部楼层
回复 6# haijie1223


    发哥有没其他办法啊,感觉这种效率不高啊
发表于 2017-5-3 22:46:48 | 显示全部楼层
回复 7# fenhanxue


    想要效率多高啊,你把循环放到gdi里面啊。除了gdi,暂时没想到其他办法。
发表于 2017-5-4 02:19:54 | 显示全部楼层
本帖最后由 kk_lee69 于 2017-5-4 02:30 编辑

回复 1# fenhanxue

我覺得這個問題有幾個地方 要先釐清楚

壞掉的定義是??

我只知道 每種圖片 其實都有其 開頭..... PNG 與 JPG 就不同.....
如果用二禁制開頭判斷呢??

圖片 出現一半 被切掉了  那算壞掉嗎??
圖片有出現  但是檔案大小是 500MB  那算壞掉嗎??

如果你經常救援 硬碟上的檔案 你就會發現很多這種圖片 呵呵

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2017-5-4 07:30:54 | 显示全部楼层
回复 9# kk_lee69


    文件头这个方法我看到过,不过不知道靠谱不。
 楼主| 发表于 2017-5-4 12:27:04 | 显示全部楼层
感觉文件头的效率更高

参考连接:
http://autoitx.com/forum.php?mod ... =%CE%C4%BC%FE%CD%B7
 楼主| 发表于 2017-5-4 12:27:40 | 显示全部楼层
回复 9# kk_lee69


    的确,万分感谢啦
发表于 2017-5-4 12:39:15 | 显示全部楼层
下面连接是登入状态。
参考连接:
http://www.autoitx.com/forum.php ... E%CD%B7%D5%EC%B2%E2
发表于 2017-5-9 13:36:58 | 显示全部楼层
回复 12# fenhanxue
20000个文件,不到10s,不知道你想要多么快的效率。另外抛开效率不说,你用文件头判断一下,我上传附件中的文件,是好的还是坏的。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2017-5-9 20:08:04 | 显示全部楼层
回复 14# haijie1223


    发哥我错了。。。。不要生气。。。

实际情况是这样的:
Global $pic = @ScriptDir & '\1.jpg'


        For $i = 1 To 100
                ;1        下载图片
                InetGet('某一图片网址',$pic)
                
                ;2        判断图片是否格式正确
                _GDIPlus_Startup()
                
                        $test = _GDIPlus_ImageLoadFromFile($sFileName)
                        If $test = -1 Then
                                        MsgBox(0,'','图片损坏')
                        Else
                                        MsgBox(0,'','图片未损坏')
                        EndIf
                                
                _GDIPlus_Shutdown()

                ;3        其他相关代码
                
                ;4        删除图片,继续同一个循环
                FileDelete($pic);实战过程中,会卡在这一步没有反应,即        $pic 无法被删除,所以我放弃了用        _GDIPlus_ImageLoadFromFile         来判断
        Next
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-17 02:36 , Processed in 0.079383 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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