Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Графика > Работа с размерами JPEG фалйа


Автор: InfMag 10.4.2005, 16:21
В PHP же доступно работать с изображениями JPEG, так?
Дык мне вот что нужно:
  • Можно ли любой рисунок преобразовать в размер 100 на 100 без искажений, как это делает фотошоп?
  • Могу ли я при этом конверте сделать рисунок шириной в 100 пикселей, но если высота остается больше 100 пикселей, то ее не сжимать до 100, а сжать ширину до 100, а то, что останется ниже высоты в 100 обрезать?
  • И третье smile

Добавлено @ 16:25
Если что, то подскажите мне как хотябы только сжать до 100 на 100 рисунок любого размера, а потом передать его юзеру через заголовки. smile

Автор: Mal Hack 10.4.2005, 17:26
Цитата(InfMag @ 10.4.2005, 17:21)
Можно ли любой рисунок преобразовать в размер 100 на 100 без искажений, как это делает фотошоп?

Да. imagecopyresampled();

Цитата(InfMag @ 10.4.2005, 17:21)
Могу ли я при этом конверте сделать рисунок шириной в 100 пикселей, но если высота остается больше 100 пикселей, то ее не сжимать до 100, а сжать ширину до 100, а то, что останется ниже высоты в 100 обрезать?

Да.

Цитата(InfMag @ 10.4.2005, 17:21)
И третье smile

http://php.net/image

Автор: InfMag 10.4.2005, 19:58
Mal Hack
Списиб. Погляжу. smile

Автор: InfMag 11.4.2005, 10:10
Я вот написал код:
Код

<?php
header("Content-type: image/jpeg");
$image = "upload/mydoom.jpg";
$img = ImageCreateFromJpeg($image);
$imgWidth = ImageSX($img);
$imgHeight = ImageSY($img);
$newHeight = $imgHeight;
$new_img = imagecreate(100, $newHeight); 
ImageCopyResized($new_img, $img, 0, 0, 0, 0, 100, $newHeight, $imgWidth, $imgHeight);
ImageDestroy($img);
ImageJpeg($new_img);
ImageDestroy($new_img);
?>

Как видите трабл в том, что я не знаю как подсчитать height. Мне нужно сделать так, чтобы height уменьшался вместе с width'ом, но тока, чтоб не также до 100, а чтобы пропорционально ему. Как это и делает браузер если у рисунка писать тока width <img src="picture.jpg" width=100>
Возникла также еще одна проблема. Искажения есть, но в цветах. Когда я вижу результат всего этого, то рисунок теряет много цветов. smile
Плиз, помогите.

Автор: InfMag 11.4.2005, 10:47
Mal Hack
Я уже нашел.
http://forum.vingrad.ru/index.php?showtopic=18570&st=0&#entry124956
ImageCreateTrueColor()

Я вижу ты сам этому вопросу задавался. smile

Вот тока осталось с height'ом решить. smile

Автор: Ищущий! 20.4.2005, 23:11
А у меня была проблема с качеством картинки.. после такого скрипта (почти такого).. цвета искажались...

Автор: Mal Hack 20.4.2005, 23:24
т.к. надо было не resize, а resampled использовать

Автор: $дмитрий 21.4.2005, 23:32
Цитата
Как видите трабл в том, что я не знаю как подсчитать height

Код

list($width, $height) = getimagesize($name_file);

Цитата
А у меня была проблема с качеством картинки..

Код

imagecopyresampled();

Цитата
Можно ли любой рисунок преобразовать в размер 100 на 100 без искажений,

Код

function pic($name_big)
{
header('Content-type: image/jpeg');
list($width, $height) = getimagesize($name_big);
      $s_im=imagecreatefromjpeg($name_big);
      $d_im=imagecreatetruecolor(100, 100);
      imagecopyresampled($d_im, $s_im, 0, 0, 0, 0, 100, 100, $width, $height);
      imagejpeg($d_im);
      ImageDestroy($d_im);
}

Автор: Ищущий! 22.4.2005, 18:11
Вот теперича можно вообстче бомбы делать... всмысле всё хорошо и красиво smile

Автор: Slayer2005 2.9.2005, 16:07
Чтоб изменить размеры, сохранить пропорции и не исказить цвета, советую такую вещь:

Код

//------------------------------------------Создание уменьшенной копии картинки JPG
 function MakeSmallImage($image, $smallwidth, $smallheight)
 { $sizes = @getimagesize($image);
 $width = $sizes[0];  $height = $sizes[1]; $type = $sizes[2]; 
 if ($smallwidth=="auto" && $smallheight=="auto") { $newwidth=$width; $newheight=$height;
                                                                               }
 if ($smallwidth>0 && $smallheight>0) { $newwidth=$smallwidth; $newheight=$smallheight;
                                                                               }                                                                               
 if ($smallwidth>0 && $smallheight=="auto") { $newwidth=$smallwidth; $mw=($width/$smallwidth);
 $newheight = ($height/$mw);                       }
 if ($smallwidth=="auto" && $smallheight>0) { $newheight=$smallheight; $mw=($height/$smallheight);
 $newwidth = ($width/$mw);                          }
 $im  = ImageCreateFromJPEG($image); $im2 = ImageCreateTrueColor($newwidth,$newheight);
 ImageCopyResampled($im2,$im,0,0,0,0,$newwidth,$newheight,$width,$height);
 $image2=str_replace(".jpg","_s.jpg",$image);
 ImageGammacorrect ($im2, 1.0, 1.1); ImageJpeg($im2,$image2); ImageDestroy($im2);
 }


Автор: AntonioBanderaz 5.9.2005, 00:20
А можно классом воспользоваться....

Код

<?
class ImaSize { 
    var $image = 0; 

    function ImaSize($img='', $typ='') { 
        if($this->image) @ImageDestroy($this->image); 
        if($img!='') { 
            $typ = strtolower($typ); 
            if(($typ == 'string') || (!@file_exists($img))) $this->loadFromString($img); 
                else $this->loadFromFile($img, $typ); 
        } 
    } 

    function loadFromString($strng) { 
        if($this->image) @ImageDestroy($this->image); 
        return ($this->image = @ImageCreateFromString($strng)); 
    } 

    function loadFromFile($fn, $typ='') { 
        if($this->image) @ImageDestroy($this->image); 
        if(!@file_exists($fn)) $this->image = 0; else { 
            if(($typ=='jpeg')||($typ=='jpg')) $this->image = @ImageCreateFromJPEG($fn); 
            elseif($typ=='png') $this->image = @ImageCreateFromPNG($fn); 
            elseif($typ=='gif') $this->image = @ImageCreateFromGIF($fn); 
            if(!$this->image) { 
                $funcar = @get_extension_funcs('gd'); 
                foreach($funcar as $func) { 
                    if($this->image) break; 
                    $func = strtolower($func); 
                    if(substr($func,0,15) != 'imagecreatefrom') continue; 
                    if(substr($func,15) == 'string') continue; 
                    $this->image = @$func($fn); 
                } 
            } 
        } 
        return $this->image; 
    } 

    function sizeTo($x, $y, $clr=0) { 
        if((!$this->image) || (($x*$y) < 1)) return 0; 
        if(sizeof($clr) != 3) $clr = array(255,255,255); 
        $img = @ImageCreate($x, $y); 
        $bg = @ImageColorAllocate($img, $clr[0], $clr[1], $clr[2]); 
        $sx = @ImageSX($this->image); $sy = @ImageSY($this->image); 
        $dw = (float)($x / $sx); $dh = (float)($y / $sy); 
        $dd = ($dw < $dh) ? $dw : $dh; 
        @ImageCopyResized($img, $this->image, 
            (int)(($x-($sx*$dd))/2), (int)(($y-($sy*$dd))/2), 
            0, 0, 
            (int)($sx*$dd)+1, (int)($sy*$dd)+1, 
            $sx, $sy); 
        @ImageDestroy($this->image); 
        return ($this->image = $img); 
    } 
}; 
?>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)