Что нового

Не удалить файл после использования его с функциями GDIPlus

Gealut

Новичок
Сообщения
38
Репутация
0
Помогите, плиз.

Берется картинка, загружается в память, перемасштабируется (так, чтобы высота была 600 пикселей), сохраняется с качеством 90% под новым именем. И теперь нужно удалить исходный файл, а никак :(

Код:
#include "File.au3"
#Include "GDIPlus.au3"
$NewSizeH = 600

_GDIPlus_Startup()
$CurImage = _GDIPlus_ImageLoadFromFile("1.jpg")
$NewSizeW = Round((_GDIPlus_ImageGetWidth($CurImage) * 600) / _GDIPlus_ImageGetHeight($CurImage))
$CurImage = _GDIPlus_GetImageThumbnail($CurImage, $NewSizeW, $NewSizeH)
If FileExists("2.jpg") Then FileRecycle("2.jpg")
$sCLSID = _GDIPlus_EncodersGetCLSID("JPG")
$tParams = _GDIPlus_ParamInit (1)
$tData = DllStructCreate("int Quality")
DllStructSetData($tData, "Quality", 90)
$pData = DllStructGetPtr($tData)
_GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
$pParams = DllStructGetPtr($tParams)
_GDIPlus_ImageSaveToFileEx($CurImage, "2.jpg", $sCLSID, DllStructGetPtr($tParams))
_GDIPlus_ImageDispose($CurImage)
_GDIPlus_Shutdown()
$TestCount = 0
While Not FileRecycle("1.jpg")
	sleep(100)
	$TestCount += 1
	MsgBox(4096,"Test",$TestCount & " неудачных попыток удалить файл")
WEnd
Exit

Func _GDIPlus_GetImageThumbnail($hImage, $iWidth, $iHeight)
    Local $Ret = DllCall($ghGDIPDll, 'int', 'GdipGetImageThumbnail', 'ptr', $hImage, 'int', _
						 $iWidth, 'int', $iHeight, 'ptr*', 0, 'ptr', 0, 'ptr', 0)
    If (@error) Or ($Ret[0]) Then
        Return SetError(1, 0, 0)
    EndIf
    Return $Ret[4]
EndFunc   ;==>_GDIPlus_GetImageThumbnail


Подскажите, плиз, что я делаю не так? FileRecycle или FileDelete - без разницы, не удаляет ни та, ни другая.

И заодно есть вопрос по оптимизации этого скрипта. Плоховато я пока понимаю те параметры, которые можно задавать в _GDIPlus_ImageSaveToFileEx. Наверняка там можно задать перемасштабирование картинки при сохранении, там же есть параметр $GDIP_EPGTRANSFORMATION. Вот только как им пользоваться, примерчик не дадите? Именно для изменения размеров картинки.

Тогда можно будет от отдельной процедуры по перемасштабированию отказаться, тем более что она несколько кривоватая, периодически очень сильно портит качество джипегов. Например, вот такой: http://ifolder.ru/29155903 . И это, фактически, третий мой вопрос. Может, надо какие-то еще параметры при сохранении картинок поправить, чтобы сохранить исходное качество при перемасштабировании?

Буду благодарен любой помощи.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Gealut [?]
теперь нужно удалить исходный файл, а никак
Потому что не нужно использовать одну и ту же переменную для Thumbnail:

Код:
_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile("1.jpg")
$NewSizeW = Round((_GDIPlus_ImageGetWidth($hImage) * 600) / _GDIPlus_ImageGetHeight($hImage))
$hThumb = _GDIPlus_GetImageThumbnail($hImage, $NewSizeW, $NewSizeH)
If FileExists("2.jpg") Then FileRecycle("2.jpg")
$sCLSID = _GDIPlus_EncodersGetCLSID("JPG")
$tParams = _GDIPlus_ParamInit (1)
$tData = DllStructCreate("int Quality")
DllStructSetData($tData, "Quality", 90)
$pData = DllStructGetPtr($tData)
_GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
$pParams = DllStructGetPtr($tParams)
_GDIPlus_ImageSaveToFileEx($hThumb, "2.jpg", $sCLSID, DllStructGetPtr($tParams))
_GDIPlus_ImageDispose($hImage)
_GDIPlus_ImageDispose($hThumb)
_GDIPlus_Shutdown()


Что касается остального...
Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Администратор.
 
Автор
G

Gealut

Новичок
Сообщения
38
Репутация
0
Ясно, спасибо, помогло.

Жаль, что нельзя перезаписывать в ту же переменную, потому как у меня в реальном скрипте масштабирование производится только при определенных условиях и пришлось добавить конструкцию типа:

Код:
Else
	$hThumb = $hImage
	...


чтобы потом сохранять $hThumb.

А по остальным вопросам - сорри, мне казалось, что тема одна: работа с изображением при помощи GDIPlus. Нет проблем, задам вопросы в отдельных темах.
 
Верх