Что нового

Как Сжать jpg картинку(ухудшить качество)?

shm_alex

Новичок
Сообщения
34
Репутация
4
Мне кажется я видел рабочие примеры на форуме но не могу уже вторые сутки их найти :laugh: то ли в полезняшках оно было то ли ещё где
Ну собственно проблема проста есть пару тысяч картинок в jpg , нужно ухудшить их качество (чтоб они поменьше весили и чтоб можно было отправить их в интырнет)
Киньте пожалуйста ссылку на рабочий пример либо посоветуйте что надо изменить в коде (код из хелпа выдран http://dundats.mvps.org/help/html/libfunctions/_GDIPlus_ImageSaveToFileEx.htm)
Код:
_GDIPlus_Startup ()

	; Load image
	$hImage = _GDIPlus_ImageLoadFromFile (@MyDocumentsDir & "\GDIPlus_Image.jpg")

	; Get JPEG encoder CLSID
	$sCLSID = _GDIPlus_EncodersGetCLSID ("JPG")

	; Set up parameters for 90 degree rotation
	$tData = DllStructCreate("int Data") 
	DllStructSetData($tData, "Data", $GDIP_EVTTRANSFORMROTATE90) ;;я чувствую здесь надо рыть
	$tParams = _GDIPlus_ParamInit (1);я чувствую здесь надо рыть
	_GDIPlus_ParamAdd ($tParams, $GDIP_EPGTRANSFORMATION, 1, $GDIP_EPTLONG, DllStructGetPtr($tData, "Data"))

	; Save image with rotation
	_GDIPlus_ImageSaveToFileEx ($hImage, @MyDocumentsDir & "\GDIPlus_Image2.jpg", $sCLSID, DllStructGetPtr($tParams))

	; Shut down GDI+ library
	_GDIPlus_ShutDown ()

чтоб он не поворачивал картинку на 90 градусов а сжимал её на 20% от исходного качества например.


Добавлено:
Сообщение автоматически объединено:

Вроде работает, сам нашёл и написал , не понимаю всего да и разбираться лень
Код:
Compress_Jpg_Img("E:\VM_Shared\jugger\JGR\Statistic\Full_For_Inet\All_Panel_2011_01_10_04_27_52.jpg","E:\VM_Shared\jugger\JGR\Statistic\Full_For_Inet1\All_Panel_2011_01_10_04_27_52.jpg ",30);
func Compress_Jpg_Img($sPath_To_Source_Jpg_File,$sPath_To_Result_Jpg_File,$iQuality=100)
	_GDIPlus_Startup ()
	$hImage = _GDIPlus_ImageLoadFromFile ($sPath_To_Source_Jpg_File)
	; Get JPEG encoder CLSID
	$sCLSID = _GDIPlus_EncodersGetCLSID ("JPG")
	$tParams = _GDIPlus_ParamInit (1)
    $tData = DllStructCreate("int Quality")
    DllStructSetData($tData, "Quality", $iQuality) ;quality 0-100
    $pData = DllStructGetPtr($tData)
    _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
    $pParams = DllStructGetPtr($tParams)
	; Save image with requred quality
	_GDIPlus_ImageSaveToFileEx ($hImage, $sPath_To_Result_Jpg_File, $sCLSID, $pParams)
	; Shut down GDI+ library
	_GDIPlus_ShutDown ()
EndFunc

Не понятно пока как люди документацию ищут на структуры которые заполняют с помощью DllStructCreate...
строки
Код:
$tData = DllStructCreate("int Quality")
    DllStructSetData($tData, "Quality", $iQuality) ;quality 0-100
    $pData = DllStructGetPtr($tData)
    _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
    $pParams = DllStructGetPtr($tParams)
были откровенно содраны из форума без разбирательств , непонятно одно что я должен был прочесть чтобы их написать самому не прибегая к помощи форумаhttp://www.autoitscript.com/forum/topic/110501-gdiplus-change-quality-scale/))) и гугля)))

PS Если кто всё же будет использовать этот код, скажу что он отказался копировать файл сам в себя
Compress_Jpg_Img("All_Panel_2011_01_10_04_27_52.jpg","All_Panel_2011_01_10_04_27_52.jpg",30) - так не будет работать
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
shm_alex
Это называется Windows API (англ. application programming interfaces) — общее наименование целого набора базовых функций интерфейсов программирования приложений операционных систем семейств Windows и Windows NT корпорации «Майкрософт». Является самым прямым способом взаимодействия приложений с Windows. Для создания программ, использующих Windows API, «Майкрософт» выпускает SDK, который называется Platform SDK и содержит документацию, набор библиотек, утилит и других инструментальных средств.

Все функции WinApi описаны в библиотеке MSDN. Именно ее и необходимо читать.

Если ответ на вопрос найден, то и тему необходимо отметить, как решена.
 

Dark-Side

Знающий
Сообщения
72
Репутация
17
И правда, было бы полезно написать скрипт, ухудшающий качество и уменьшаюший в масштабах изображение, а то выкладывать фотку в 12mp куда-нить... это ужас. Конечно, можно открыть фотошоп или даже пэинтом, и там все отредактировать вручную, но скриптом быстрее и удобнее :smile:
 
Автор
S

shm_alex

Новичок
Сообщения
34
Репутация
4
madmasles сказал(а):
Makc
Вот первая тема, найденная в поиске по форуму с запросом изменение размеров: Изменение размеров картинки с помощью GDI+.
Еще здесь посмотрите: Изменение размера картинки с сохранением пропорций.
спасибо, эти темы читал, они немного не про то, они про изменение размера например была картинка 640x480 а нужно уменьшить до 320x240, а мне нужно сохранить размер ,но ухудшить качество, я не силён в способе кодирования JPG но сам формат позволяет это сделать . Вопрос закрыл сам ) (У меня есть друг - это его оборот над которым я смеялся , он работает PM-ом, ну и на дружеской пьянке, мы у него спрашиваем ну ты то сам что делаешь ? а он гордо- "я вопросы закрываю..." - занавес - с тех пор люблю вставить этот оборот , естественно с юмором)) ) . функция написанная мной см выше - работает.
Я её немного переработал она ещё мой мэйл на картинке пишет )
кому интерестно работающий пример вот->
Код:
#Include <File.au3>
#Include <Array.au3>
#include <GDIPlus.au3>
$Files_Path="E:\VM_Shared\jugger\JGR\Statistic\Full_For_Inet\"
$Files_Result_Path="E:\VM_Shared\jugger\JGR\Statistic\Full_For_Inet2\"
$Files_Mask="*.jpg"

Global $FileList=_FileListToArray($Files_Path,$Files_Mask,1)
$Nmbr_Files=$FileList[0]
_ArrayDelete($FileList,0);в нулевом элементе лежит коичество файлов, эта запись мне ненужна
;_ArrayDisplay($FileList)
 $handled_files=0
  for $File in $FileList
  	if Compress_Jpg_Img_And_Add_Text($Files_Path&$File,$Files_Result_Path&$File,30,"[email protected]") Then
		$handled_files+=1
		ConsoleWrite("file "&$Files_Path&$File&" handled "&Int(100*$handled_files/$Nmbr_Files)&"%"&@CRLF)
	Else	
		ConsoleWrite("file "&$Files_Path&$File&" handled failure"&@CRLF)
	EndIf	
  Next

func Compress_Jpg_Img_And_Add_Text($sPath_To_Source_Jpg_File,$sPath_To_Result_Jpg_File,$iQuality=100,$sText="hello world",$xColor = 0xFFFFFFFF)

$iFontSize = 12
$iFontStyle = 3

_GDIPlus_Startup()
$hFamily = _GDIPlus_FontFamilyCreate('Arial')
$hFont   = _GDIPlus_FontCreate($hFamily, $iFontSize, $iFontStyle)
$hFormat = _GDIPlus_StringFormatCreate()


$hImage = _GDIPlus_ImageLoadFromFile($sPath_To_Source_Jpg_File)
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)



$iLeft = 5
$iTop = _GDIPlus_ImageGetHeight($hImage)/2


$tLayout  = _GDIPlus_RectFCreate($iLeft, $iTop)
$hBrush  = _GDIPlus_BrushCreateSolid($xColor)
$aInfo    = _GDIPlus_GraphicsMeasureString($hGraphic, $sText, $hFont, $tLayout, $hFormat)

_GDIPlus_GraphicsDrawStringEx($hGraphic, $sText, $hFont, $aInfo[0], $hFormat, $hBrush)

	$sCLSID = _GDIPlus_EncodersGetCLSID ("JPG")
	$tParams = _GDIPlus_ParamInit (1)
    $tData = DllStructCreate("int Quality")
    DllStructSetData($tData, "Quality", $iQuality) ;quality 0-100
    $pData = DllStructGetPtr($tData)
    _GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
    $pParams = DllStructGetPtr($tParams)
	; Save image with requred quality
	$ret=_GDIPlus_ImageSaveToFileEx ($hImage, $sPath_To_Result_Jpg_File, $sCLSID, $pParams)

_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hImage  )

_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_FontDispose($hFont)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_Shutdown()
return $ret
EndFunc

PS Замечено что если 1 байт у цвета $xColor не равен 0xFF функция ничего не рисует(это для меня было немного странно , назначение этого байта в цвете мне непонятно. ) Функция не работает если файл $sPath_To_Result_Jpg_File существует
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
shm_alex сказал(а):
Замечено что если 1 байт у цвета $xColor не равен 0xFF функция ничего не рисует (это для меня было немного странно , назначение этого байта в цвете мне непонятно.)

Цвета в GDI+ задаются в виде ARGB (Alpha + Red + Green + Blue), где Alpha - прозрачность (может принимать значения от 0 до 255). Если ты задаешь цвет как 0xFFFFFF, то это равносильно 0x00FFFFFF, т.е. абсолютно прозрачный цвет, и следовательно, ничего нарисовано не будет. Можно написать 0x80FFFFFF (полупрозрачный).
 
Верх