Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поворот изображения 
:(
    Опции темы
pnd_ku
Дата 6.1.2007, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 25.9.2006

Репутация: нет
Всего: 1



Приятного smile
я тож подумаю ещё и поэкспериментирую...
PM MAIL   Вверх
PARROT
Дата 6.1.2007, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2339
Регистрация: 5.1.2005
Где: Спб-ЦарьГрад

Репутация: 2
Всего: 50



Посмотрите тут: http://www.komkon.org/~denis/mydoc/gd.htm может поможет  smile 


--------------------
Безумный утешается прошедшим, слабоумный - будущим, умный - настоящим!
PM MAIL   Вверх
Mal Hack
Дата 6.1.2007, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Кажется мне, что все эти глюк от несоверщенства GD..
Порылся в закромах phpclub'a, как всегда, ничего дельного кроме фразы "пошел в поиск" не нашел... Решил глянуть комменты в оф мане, на случай, если что проглядел...

http://ru2.php.net/manual/ru/function.imagerotate.php#46338
Код
/*
imagerotate does not preserve the alpha channel, so if you want to rotate a PNG you need to get
creative. I don't see any command to retrieve the alpha information from an image (as far as
I could see,) so you'll have to do a bit of manual labor before hand. In my case I created a
second PNG file with the alpha saved as RGB data and manually "copied" the data from source
to destination:
*/
   function alpha_rotate($dst,$src,$rotate,$offsetX,$offsetY){

       $top = imagecreatefrompng("image_processing/shadow.png");
       $top_alpha = imagecreatefrompng("image_processing/shadow_alpha.png");
              
       imagecopyresampled($top,$src,0,0,0,0,100,100,100,100);
              
       $top = imagerotate($top,$rotate,0x000000);
       $top_alpha = imagerotate($top_alpha,$rotate,0x000000);
  
  
       for ($theX=0;$theX<imagesx($top);$theX++){
           for ($theY=0;$theY<imagesy($top);$theY++){
  
               $rgb = imagecolorat($top,$theX,$theY);
               $r = ($rgb >> 16) & 0xFF;
               $g = ($rgb >> 8) & 0xFF;
               $b = $rgb & 0xFF;
              
               $rgb = imagecolorat($top_alpha,$theX,$theY);
               $a = $rgb & 0xFF;
               $a = 127-floor($a/2);

               $myColor = imagecolorallocatealpha($top,$r,$g,$b,$a);
               imagesetpixel($dst,($theX+$offsetX),($theY+$offsetY),$myColor);   
           }
       }
   }


http://ru2.php.net/manual/ru/function.imagerotate.php#52288
Цитата

Imagerotate apparently destroy transparency information (transparent areas turn to black). For now the only walkaround I found is to use  :

imagecolortransparent($image,imagecolorat($image,0,0));

but the result is quite awful if your original picture uses smooth transparency (which is probably the case with PNG pictures)

PM ICQ   Вверх
pnd_ku
Дата 7.1.2007, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 25.9.2006

Репутация: нет
Всего: 1



гонять по картинке в 1024х1024 по пикселям в пхп  - жесть имхо smile
хотя вариант с маской интересный, не спорю...

родилось более быстрое решение и стандартными средствами - чтобы повернуть на угол, больший 45 градусов, мы отражаем картинку по вертикали, и потом уже поворачиваем..
и попадаем во всю шкалу градусов без проблем.

воть smile
спасиба!
PM MAIL   Вверх
Mal Hack
Дата 7.1.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



pnd_ku, код итоговый приведи.

PM ICQ   Вверх
pnd_ku
Дата 9.1.2007, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 25.9.2006

Репутация: нет
Всего: 1



да да, конечно!
Тока отражение по вертикали тоже не сохраняло прозарчности, поэтому для решения всех головняков была сотварена самостоятельная фугкция поворота изображения (пнг с альфа каналом)
Вот.
Код

<?
//function rotate image
function imRotate($src_img,$angle,$bicubic=false)
{
    $angle=-$angle + 180;
    $angle=deg2rad($angle);
    $src_x=imagesx($src_img);
    $src_y=imagesy($src_img);
    $center_x=floor($src_x/2);
    $center_y=floor($src_y/2);
    $cosangle=cos($angle);
    $sinangle=sin($angle);
    $corners=array(array(0,0),array($src_x,0),array($src_x,$src_y),array(0,$src_y));
    foreach($corners as $key=>$value)
    {
        //Translate coords to center for rotation
        $value[0]-=$center_x;
        $value[1]-=$center_y;
        $temp=array();
        $temp[0]=$value[0]*$cosangle+$value[1]*$sinangle;
        $temp[1]=$value[1]*$cosangle-$value[0]*$sinangle;
        $corners[$key]=$temp;    
    }
    $min_x=1000000000000000;
    $max_x=-1000000000000000;
    $min_y=1000000000000000;
    $max_y=-1000000000000000;
    foreach($corners as $key => $value)
    {
        if($value[0]<$min_x)
            $min_x=$value[0];
        if($value[0]>$max_x)
            $max_x=$value[0];
        if($value[1]<$min_y)
            $min_y=$value[1];
        if($value[1]>$max_y)
            $max_y=$value[1];
    }
    $rotate_width=round($max_x-$min_x);
    $rotate_height=round($max_y-$min_y);
    $rotate=imagecreatetruecolor($rotate_width,$rotate_height);
    imagealphablending($rotate, false);
    imagesavealpha($rotate, true);
    //Reset center to center of our image
    $newcenter_x=($rotate_width)/2;
    $newcenter_y=($rotate_height)/2;
    for($y=0;$y<($rotate_height);$y++)
    {
        for($x=0;$x<($rotate_width);$x++)
        {
            // rotate...
            $old_x=round((($newcenter_x-$x)*$cosangle+($newcenter_y-$y)*$sinangle))+$center_x;
            $old_y=round((($newcenter_y-$y)*$cosangle-($newcenter_x-$x)*$sinangle))+$center_y;
            if($old_x>=0&&$old_x<$src_x&&$old_y>=0&&$old_y<$src_y)
            {
                $color=imagecolorat($src_img,$old_x,$old_y);
            }
            else
            {
                // this line sets the background colour
                $color=imagecolorallocatealpha($src_img,255,255,255,127);
            }
            imagesetpixel($rotate,$x,$y,$color);
        }
    }
    return($rotate);
}

###################################################################
###################################################################
###################################################################

//background and overlay images
$background="bg.jpg";
$overlay="overlay.png";

//check for files
if(!file_exists($background)||!file_exists($overlay))
    die("no source images");

//get variables
$text=substr(trim($_GET['text']),0,10);
$angle=(float)trim($_GET['angle']);
if($angle<0)
    $angle=0;
if($angle>359)
    $angle=359;

//create image handle
switch(strtolower(substr($background,strrpos($background,".")+1)))
{
    case "gif":
        $im=imagecreatefromgif($background);
        break;
    case "jpg":
        $im=imagecreatefromjpeg($background);
        break;
    case "jpeg":
        $im=imagecreatefromjpeg($background);
        break;
    case "png":
        $im=imagecreatefrompng($background);
        break;
    case "bmp":
        $im=imagecreatefromwbmp($background);
        break;
    default:
        die("unsupported file format");
}

//create overlay image handle
$im1=imagecreatefrompng($overlay);
imagesavealpha($im1,true);
//rotate overlay image
$im1=imRotate($im1,$angle);
//merge images
$left=(imagesx($im)-imagesx($im1))/2;
$top=(imagesy($im)-imagesy($im1))/2;
imagecopy($im,$im1,$left,$top,0,0,imagesx($im1),imagesy($im1));


//create text
$bbox=imageftbbox ( 25, $angle, "arial.ttf", $text);
$width=abs($bbox[4]-$bbox[0]);
$height=abs($bbox[1]-$bbox[5]);
imagettftext($im,25,$angle,(imagesx($im)-$width*cos(deg2rad($angle)))/2,(imagesy($im)+$height*sin(deg2rad($angle)))/2,imagecolorallocate($im,255,255,255),"arial.ttf",$text);

//output image at png format
header("Content-type: image/png");
imagepng($im);

//destroy images in memory
imagedestroy($im);
imagedestroy($im1);
?>

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Графика | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.