Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Изменение размера jpg, bmp (http://forum.oszone.net/showthread.php?t=339446)

-TRM- 27-02-2019 11:44 2860291

Изменение размера jpg, bmp
 
Приветствую, возможно ли изменять размеры "рисунков" в 640*480 не теряя качества изображения ?
Пробовал так, но качество сильно ухудшается.
Код:

#include <GDIPlus.au3>
Func Pic_Image($PIC_Load, $Pic_Save, $Pic_Horizontal, $Pic_Vertikal)
        FileDelete($Pic_Save)
        _GDIPlus_Startup()
        $hImage = _GDIPlus_ImageLoadFromFile($PIC_Load)
        ;$H = _GDIPlus_ImageGetHeight($hImage)
        ;$W = _GDIPlus_ImageGetWidth($hImage)
        ;ConsoleWrite('$H='&$H&@CR)
        ;ConsoleWrite('$W='&$W&@CR)

        ;    $H1 =$Wnew
        ;    $W1 =$Wnew / $H * $W


        $hThumb = _GDIPlus_ImageGetThumbnail($hImage, $Pic_Horizontal, $Pic_Vertikal)
        _GDIPlus_ImageSaveToFile($hThumb, $Pic_Save)
        _GDIPlus_ImageDispose($hImage)
        _GDIPlus_ImageDispose($hThumb)
        _GDIPlus_Shutdown()
EndFunc

Pic_Image("с:\6.jpg", "с:\background.bmp", 640, 480)

Только нужно чтобы выходной файл был в формате BMP

mwz 27-02-2019 16:09 2860362

Цитата:

Цитата -TRM-
возможно ли изменять размеры "рисунков" в 640*480 не теряя качества изображения ? »

Изменение размеров без изменения качества изображения невозможно. Причём "изменение" здесь — это отнюдь не улучшение: это от почти незаметного до очень заметного ухудшения.

Iska 27-02-2019 19:11 2860409

-TRM-, рисунков какого размера?

mwz 27-02-2019 20:10 2860426

Iska, я даже не стал задавать этот вопрос. Ответ одинаков. :)

Creat0R 27-02-2019 20:14 2860428

Цитата:

Цитата -TRM-
возможно ли изменять размеры "рисунков" в 640*480 не теряя качества изображения ? »

Если уменьшать то можно, если увеличивать то нет.

Цитата:

Цитата -TRM-
Пробовал так »

Так это же сохраняет в миниатюрную копию (thumbnail), т.е то что обычно используется для предпросмотра, а нужно использовать ImageResize:

Код:

Func Pic_Image($PIC_Load, $Pic_Save, $Pic_Horizontal, $Pic_Vertikal)
    FileDelete($Pic_Save)
    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile($PIC_Load)
    $hResized = _GDIPlus_ImageResize($hImage, $Pic_Horizontal, $Pic_Vertikal)
    _GDIPlus_ImageSaveToFile($hResized, $Pic_Save)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_ImageDispose($hResized)
    _GDIPlus_Shutdown()
EndFunc

И формат нужно сохранять тот же, иначе нужно использовать _GDIPlus_ImageSaveToFileEx.

Iska 27-02-2019 20:18 2860430

Цитата:

Цитата Creat0R
Так это же сохраняет в миниатюрную копию (thumbnail) »

Я даже не поглядел код :(.

-TRM- 01-03-2019 17:34 2860731

Цитата:

Цитата Creat0R
И формат нужно сохранять тот же »

Нарушил ваше условие, загнал картинку в jpg и указал на выходе bmp - вроде как получил на выходе реальный bmp.

Creat0R 02-03-2019 01:27 2860834

Цитата:

Цитата -TRM-
вроде как получил на выходе реальный bmp »

Без потери качества?

Iska 02-03-2019 02:53 2860842

Цитата:

Цитата Creat0R
Без потери качества? »

А где ему там теряться?

-TRM- 02-03-2019 09:59 2860855

Цитата:

Цитата Creat0R
Без потери качества? »

Да.
Пока над этим не размышлял, но может уже у кого то есть готовое решение ? Как в скрипте предложенным от Creat0R сделать так, чтобы высота была пропорциональна ширине т.е. она не обязательно должна быть 480 иначе картинка растягивается ?

Creat0R 02-03-2019 13:22 2860886

Цитата:

Цитата -TRM-
сделать так, чтобы высота была пропорциональна ширине »

Код:

#include <GDIPlus.au3>

_Image_Scale('Src.jpg', 'Dst.jpg', 0.5)

Func _Image_Scale($sSrc_File, $sDest_File, $iScale)
    _GDIPlus_Startup()

    Local $hImage = _GDIPlus_ImageLoadFromFile($sSrc_File)
    Local $hResized = _GDIPlus_ImageScale($hImage, $iScale, $iScale)

    _GDIPlus_ImageSaveToFile($hResized, $sDest_File)

    _GDIPlus_imageDispose($hImage)
    _GDIPlus_ImageDispose($hResized)

    _GDIPlus_Shutdown()
EndFunc

Это в два раза уменьшит размер.

Creat0R 02-03-2019 14:18 2860888

Можно ещё так (с возможностью указать фиксированную ширину):

Код:

#include <GDIPlus.au3>

_Image_Scale('Src.jpg', 'Dst.jpg', 400)

Func _Image_Scale($sSrc_File, $sDest_File, $iWidth, $iHeight = -1)
    _GDIPlus_Startup()

    Local $hImage = _GDIPlus_ImageLoadFromFile($sSrc_File)
    Local $iImg_W = _GDIPlus_ImageGetWidth($hImage)
    Local $iImg_H = _GDIPlus_ImageGetHeight($hImage)

    Local $iScale, $hResized

    If $iHeight = -1 Then
        $iScale = (100 / $iImg_W * $iWidth) / 100
        $hResized = _GDIPlus_ImageScale($hImage, $iScale, $iScale)
    Else
        $hResized = _GDIPlus_ImageResize($hImage, $iWidth, $iHeight)
    EndIf

    _GDIPlus_ImageSaveToFile($hResized, $sDest_File)

    _GDIPlus_imageDispose($hImage)
    _GDIPlus_ImageDispose($hResized)

    _GDIPlus_Shutdown()
EndFunc



Время: 05:14.

Время: 05:14.
© OSzone.net 2001-