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

Поиск:

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


Шустрый
*


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

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



Драствуйте!
Возникла такая проблема:
Я создаю изображение с прозрачным фоном, потом его поворачиваю.
Мне нужно сохранять фон прозрачным...
посматрите пожалуйста код - так будет понятнее

Код

<?php
    $angle=0;
    
    $im=imagecreatefrompng("overlay.png");
    imagesavealpha($im,TRUE);
    imagefill($im,0,0,imagecolorallocatealpha($im,0,0,0,127));
    $im=imagerotate($im,$angle,imagecolorallocatealpha($im,50,50,50,127),false);
    
    $im1=imagecreatetruecolor(imagesx($im),imagesy($im));
    imagesavealpha($im1,TRUE);
    imagefill($im1,0,0,imagecolorallocatealpha($im1,0,0,0,127));
    imagecopy($im1,$im,0,0,0,0,imagesx($im),imagesy($im));
    
    header("Content-type: image/png");
    imagepng($im1);
    ImageDestroy($im);
    ImageDestroy($im1);
?>


overlay.png  - пнгшка с альфа каналом. Если быть точнее фон полностью прозрачный, а в центре рыба smile
$angle - угол поворота. Изменяется от 45 до -44. Вернее в этих пределах всё как надо - картинка повернулась, фон прозрачный.
Но если вылезти за пределы угла, то фон становиться чорным...
Вот это проблема и я не знаю как её пофиксить smile

Есть какие-ни6уть идей??.. ))
PM MAIL   Вверх
Mal Hack
Дата 5.1.2007, 23:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



gd какой версии? Во всех браузерах черный фон?
PM ICQ   Вверх
pnd_ku
Дата 6.1.2007, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Gd 2.0.28 версии..
браузеры ессно все проверил, сохранял в файл - одна фигня.
Кстати пишет что пнг 32 битный, вывод в гиф тоже не помог.
PM MAIL   Вверх
Mal Hack
Дата 6.1.2007, 00:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код
<?php

    $angle=48;

    $im=imagecreatefrompng("test.png");
    imagesavealpha($im,true);

    $im=imagerotate($im,$angle,imagecolorallocatealpha($im,0,0,0,127),0);
    imagecolortransparent($im,imagecolorallocatealpha($im,0,0,0,127));

    header("Content-type: image/png");
    imagepng($im);
    ImageDestroy($im);
 
?>


PM ICQ   Вверх
pnd_ku
Дата 6.1.2007, 12:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



не излечилось ((
PM MAIL   Вверх
Mal Hack
Дата 6.1.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Как не излечилось, когда у меня все красиво smile
Сейчас проверю еще разок, конечно...
PM ICQ   Вверх
Mal Hack
Дата 6.1.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Интересно получается...
Код

    $angle=5;



    $im=imagecreatefrompng("test.png");
    imagesavealpha($im,TRUE);
    imagefill($im,1,1,255);
   // imagecolortransparent($im,imagecolorallocatealpha($im,0,0,0,127));
   ///imagecolorallocatealpha($im,255,255,255,127)
    imagesavealpha($im,TRUE);
    imagecolortransparent($im,255);
    imagesavealpha($im,TRUE);
    $im=imagerotate($im,$angle,255,0);
    imagecolortransparent($im,255);

Прозрачность есть в браузере, но ее нет в файле...
PM ICQ   Вверх
pnd_ku
Дата 6.1.2007, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



хммм... всё ещё нет..
не люблю я такие ситуации когда ошибка не от меня зависит...
и гд обновить не имею прав smile

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


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


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

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



Тут есть два варианты. Либо баг в gd или php, кстати, какая у тебя версия.
Либо мы оба делаем какую-то маленькую ошибку, к примеру     imagesavealpha($im,TRUE); не в том месте...
PM ICQ   Вверх
pnd_ku
Дата 6.1.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



у меня xampp

Добавлено @ 16:07 
у меня xampp последней сборки....
залил на другой хост в Кювейте smile
там пхп как сги рабоатет, версия 5.1.2, гд 2.0.28

оч странно....
PM MAIL   Вверх
Mal Hack
Дата 6.1.2007, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(pnd_ku @  6.1.2007,  16:05 Найти цитируемый пост)
там пхп как сги рабоатет, версия 5.1.2, гд 2.0.28

результат тот же?
PM ICQ   Вверх
pnd_ku
Дата 6.1.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ога smile
в зенд девелопер зон отправить чтоле чтобы посматрели....
PM MAIL   Вверх
Mal Hack
Дата 6.1.2007, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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


Шустрый
*


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

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



дык я уже посматрел перед тем как тему постить smile
всё равно вопрос это не решает...
тут трабла как раз в момент поворота картинки ( причом до определённого градуса), без него я проблем не испытываю
PM MAIL   Вверх
Mal Hack
Дата 6.1.2007, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(pnd_ku @  6.1.2007,  17:10 Найти цитируемый пост)
тут трабла как раз в момент поворота картинки ( причом до определённого градуса), без него я проблем не испытываю 

Да знаю... Сейчас поем и попробую пошариться по закромам...
PM ICQ   Вверх
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   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Графика | Следующая тема »


 




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


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

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