Что нового

Удалить все картинки, кроме имеющих разрешение 1280x720

DesMono

Новичок
Сообщения
19
Репутация
0
Нужно удалить все картинки в папке, кроме тех, что имеют разрешение 1280x720.

Нашел вот скрипт, который позволяет узнать разрешение конкретной картинки, но как прикрутить это ко всем файлам, а потом удалить не соответствующие нужному разрешению пока не разобрался. В общем совсем я новичок, не пинайте.
Код:
#include <GDIPlus.au3>

_GDIPlus_Startup()
$Image = @ScriptDir & '\Photo_001.jpg'
$hImage = _GDIPlus_ImageLoadFromFile($Image)
$Width = _GDIPlus_ImageGetWidth($hImage)
$Height = _GDIPlus_ImageGetHeight($hImage)
_GDIPlus_ImageDispose($hImage)
MsgBox(0, 'Resolution',$Width & ' x ' & $Height)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Удалить все картинки, кроме...

Неужели так сложно указать в названии темы кроме чего, вторая тема уже...
 
Автор
D

DesMono

Новичок
Сообщения
19
Репутация
0
Re: Удалить все картинки, кроме...

CreatoR [?]
Неужели так сложно указать в названии темы кроме чего, вторая тема уже...
Извиняюсь. Я тоже в этот раз подумал, что нужно написать "...кроме, имеющих разрешение". Но "разрешение" можно трактовать по-разному.
В общем исправил.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
#include <GDIPlus.au3>
#include <File.au3>

_GDIPlus_Startup()

$sIamges_Path = @ScriptDir & '\Images'

$aImages = _FileListToArray($sIamges_Path, '*.*')

For $i = 1 To UBound($aImages)-1
	$hImage = _GDIPlus_ImageLoadFromFile($sIamges_Path & '\' & $aImages[$i])
	
	$iWidth = _GDIPlus_ImageGetWidth($hImage)
	$iHeight = _GDIPlus_ImageGetHeight($hImage)
	
	_GDIPlus_ImageDispose($hImage)
	
	If $iWidth <> 1280 And $iHeight <> 720 Then
		FileDelete($sIamges_Path & '\' & $aImages[$i])
	EndIf
Next

_GDIPlus_Shutdown()
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Код:
#include <FileOperations.au3>
#include <GDIPlus.au3>
#include <Array.au3>

$sPath = @SystemDir
$aFileList = _FO_FileSearch($sPath, '*.png|*.jpg|*.gif')
$k = 0
_GDIPlus_Startup()
For $i = 1 To $aFileList[0]
	$hImage = _GDIPlus_ImageLoadFromFile($aFileList[$i])
	If Not (_GDIPlus_ImageGetWidth($hImage) = 1280 And _GDIPlus_ImageGetHeight($hImage) = 720) Then
		$k += 1
		$aFileList[$k] = $aFileList[$i] ; переписываем массив соотетственными картинками
	EndIf
	_GDIPlus_ImageDispose($hImage)
Next
_GDIPlus_Shutdown()
ReDim $aFileList[$k + 1]
$aFileList[0] = $k

_ArrayDisplay($aFileList, 'Просмотр файлов')

If MsgBox(4, 'Сообщение', 'Удалить ?') = 6 Then
	$err = ''
	For $i = 1 To $aFileList[0]
		If Not FileDelete($aFileList[$i]) Then
			If Not (FileSetAttrib($aFileList[$i], '-RST') And FileDelete($aFileList[$i])) Then
				$err &= $aFileList[$i] & @CRLF
			EndIf
		EndIf
	Next
	If $err Then MsgBox(0, 'Error', $err)
EndIf
 
Автор
D

DesMono

Новичок
Сообщения
19
Репутация
0
CreatoR
Спасибо, даже смог разобраться что к чему.

AZJIO
Немного сложно выглядит для меня )
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
DesMono
скрипты по сути одинаковы, только используются разные функции поиска. во втором скрипте дополнительные возможности не удалить сдуру. сам же все равно будешь это дописывать
вот мой вариант удаления. и он тоже похож

Код:
#include <GDIPlus.au3>
$folder_file = FileSelectFolder('', '')
$Image = _FileSearch($folder_file, "*.png;*.jpg;*.bmp", 1, 1)
_GDIPlus_Startup()
For $i = 1 To UBound($Image) - 1
	$hImage = _GDIPlus_ImageLoadFromFile($Image[$i])
	$Width = _GDIPlus_ImageGetWidth($hImage)
	$Height = _GDIPlus_ImageGetHeight($hImage)
	If $Width <> 1280 And $Height <> 720 Then
		_GDIPlus_ImageDispose($hImage)
		FileDelete($Image[$i])
	EndIf
Next
_GDIPlus_Shutdown()


Func _FileSearch($sPath, $sFileMask = "*", $iFlag = 0, $iSubDir = 1, $iSort = 0)
	Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib, $sFiles

	If Not StringInStr(FileGetAttrib($sPath), "D") Then
		Return SetError(1, 0, 0)
	EndIf

	If $iSubDir = 1 Then
		$sAttrib &= ' /S'
	EndIf

	If $iSort = 1 Then
		$sAttrib &= ' /O:N'
	EndIf

	Switch $iFlag
		Case 1
			$sAttrib &= ' /A-D'
		Case 2
			$sAttrib &= ' /AD'
		Case Else
			$sAttrib &= ' /A'
	EndSwitch

	$sOut = StringToBinary('0' & @CRLF, 2)
	$sPath = StringRegExpReplace($sPath, '\\+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';')
	$aMasks = StringSplit($sFileMask, ';')

	For $i = 1 To $aMasks[0]
		If StringStripWS($aMasks[$i], 8) = "" Then
			ContinueLoop
		EndIf

		$sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'

		If $i < $aMasks[0] Then
			$sFiles &= ';'
		EndIf
	Next

	$hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)

	While 1
		$sRead = StdoutRead($hDir, False, True)

		If @error Then
			ExitLoop
		EndIf

		If $sRead <> "" Then
			$sOut &= $sRead
		EndIf
	WEnd

	$aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)

	If @error Or UBound($aOut) < 2 Then
		Return SetError(2, 0, 0)
	EndIf

	$aOut[0] = UBound($aOut) - 1
	Return $aOut
EndFunc   ;==>_FileSearch
 
Верх