2012-02-24 22 views
4

私のウェブサイト(htmlとphpで完全にコード化されています)には、特定のユーザーが画像をアップロードできる機能があります。画像のサイズを変更し、このコードを使用して透かしを入れている:画像をPHPで埋め込む

function watermarkpic($filename) { 

ini_set('max_input_time', 300); 

require 'config.php'; 

$watermark = imagecreatefrompng('watermarknew.png'); 
$watermarkwidth = imagesx($watermark); 
$watermarkheight = imagesy($watermark); 

if(preg_match('/[.](jpg)$/', $filename)) { 
     $originalimage = imagecreatefromjpeg($path_to_image_directory . $filename); 
    } else if (preg_match('/[.](gif)$/', $filename)) { 
     $originalimage = imagecreatefromgif($path_to_image_directory . $filename); 
    } else if (preg_match('/[.](png)$/', $filename)) { 
     $originalimage = imagecreatefrompng($path_to_image_directory . $filename); 
    } 

$originalwidth = imagesx($originalimage); 
$originalheight = imagesy($originalimage); 

$maxsize = 800; 
$imgratio = $originalwidth/$originalheight; 

if($imgratio > 1) { 
    $finalwidth = $maxsize; 
    $finalheight = $maxsize/$imgratio; 
} 
else { 
    $finalheight = $maxsize; 
    $finalwidth = $maxsize * $imgratio; 
} 

$finalimage = imagecreatetruecolor($finalwidth,$finalheight); 

imagecopyresampled($finalimage, $originalimage, 0,0,0,0,$finalwidth,$finalheight,$originalwidth,$originalheight); 

imagecopymerge($finalimage, $watermark, 0, 0, 0, 0, $watermarkwidth, $watermarkheight, 100); 

//now move the file where it needs to go 
if(!file_exists($path_to_medimage_directory)) { 
     if(!mkdir($path_to_medimage_directory)) { 
       die("There was a problem. Please try again!"); 
     } 
    } 

imagejpeg($finalimage, $path_to_medimage_directory . $filename); 
} 

問題は、透かしが透明な背景を有することであるが、それは、画像上の黒い背景を有するものとして現れます。私はアルファブレンディングなどについて何かを見てきましたが、これが何であるか本当に分かりません。私は何をしているのか理解したいだけでなく、ウォーターマークが透明であるように問題を解決したい。本当の絵がその空間を満たすはずです。

ありがとうございます。

+1

Jpegsはtranparencyをサポートしていません –

答えて

0

だから私はそれを考え出しました。 imagecopymerge()を使用する代わりに、私はimagecopy()を使用しました。

PHP5でこれを引き起こすimagecopymerge()のバグがあるかもしれません。

2

スコット、ここで起こっていることがたくさんあります。

  1. アルファ透明度を使用してPNGを保存したことを確認する必要があります。インデックス化された透明度は、基本的に「この色(多分黒色)は画像全体に透明に表示されます」と言います。ブラウザやイメージエディタで読み込んだ場合、透明になることがありますが、特にJPGとマージしている場合は、透明性が維持されません。詳細を知りたい場合は、http://www.idux.com/2011/02/27/what-are-index-and-alpha-transparency/

  2. 両方の画像に正しい寸法が得られていることを確認してください。同じ問題が発生していないことを確認するには、Transparent PNG over JPG in PHPを参照してください。

  3. まだ問題が発生している場合は、http://php.net/manual/en/image.examples.merged-watermark.phpで画像の不透明度を変更する方法を確認してください。あなたが達成しようとしているものに近いかもしれませんし、別の考えをジョギングするかもしれません。

+0

imagecopymergeを使用する代わりに、イメージコピーを使用して正常に動作しました。私はphp5でこれを引き起こすimagecopymergeのバグがあるかもしれないと知っていました –

0

http://php.net/manual/en/function.imagecopymerge.php

<?php 
    $src = imagecreatefromstring(file_get_contents('watermark.png')); 
    $dest = imagecreatefromstring(file_get_contents('Unmarked/indian_elephant_chasing_bird.jpg')); 

    // Set the brush 
    imagesetbrush($dest, $src); 
    // Draw a couple of brushes, each overlaying each 
    imageline($dest, 
     imagesx($src)/2, 
     imagesy($src)/2, 
     imagesx($src)/2 , 
     imagesy($src)/2, 
     IMG_COLOR_BRUSHED); 

    header('Content-Type: image/png'); 
    imagepng($dest); 
?> 
関連する問題