2012-02-25 9 views
3

OKだから、この種のことに関連して何千もの質問があることは分かっていますが、答えは本当に私のニーズをカバーしているようです。だからここに私の問題がある。オンザフライで透かしを入れた何千もの画像にサービスを提供していますか?

私はいくつかの企業がそのプロパティの詳細と画像を保存するために使用する不動産CRMシステムを持っています。このシステムは、次にそのプロパティを宣伝するさまざまなプロパティポータルに提供します。今では明らかに透かしを入れる写真が必要です。私のシステムでは、透明なものを中央に、不透明なものを右下に置くことで2通りの方法で表示できます。これが設定されている設定に応じて、XMLフィードの画像URLに反映され、さまざまなサイトに送信されます。もちろん画像のハードコピーを持たずにロゴなどを自由に変更することができます。

右下の透かしを使用すると、いくつかのポータルすべての画像をつかんで、私は何千もの話をしています(そして、日々増加し、参加している各企業によって)、当然VPSサーバーが過負荷になり、inmotionhostingが私を傷つけてしまいます。これは私が使用しているサードパーティ製のスクリプトであり、仕事は完全に多すぎるリソースを使用しています。改善のためのアイデア?私は人々がキャッシュに言及していることを知っているが、それぞれのイメージは異なっていて、おそらく一度しか要求されていないので、それはそれほど利益があろうかあなたのすべての助けは、それがシステムを拡張することに関して私が持っている一つの頭痛であるので、高く評価されます。前もって感謝します!

<?php 
class watermark{ 

# given two images, return a blended watermarked image 
function create_watermark($main_img_obj, $watermark_img_obj, $alpha_level = 100) { 
    $alpha_level /= 100; # convert 0-100 (%) alpha to decimal 

    # calculate our images dimensions 
    $main_img_obj_w = imagesx($main_img_obj); 
    $main_img_obj_h = imagesy($main_img_obj); 
    $watermark_img_obj_w = imagesx($watermark_img_obj); 
    $watermark_img_obj_h = imagesy($watermark_img_obj); 

    # determine center position coordinates 
    $main_img_obj_min_x = floor(($main_img_obj_w/2) - ($watermark_img_obj_w/2)); 
    $main_img_obj_max_x = ceil(($main_img_obj_w/2) + ($watermark_img_obj_w/2)); 
    $main_img_obj_min_y = floor(($main_img_obj_h/2) - ($watermark_img_obj_h/2)); 
    $main_img_obj_max_y = ceil(($main_img_obj_h/2) + ($watermark_img_obj_h/2)); 


    # create new image to hold merged changes 
    $return_img = imagecreatetruecolor($main_img_obj_w, $main_img_obj_h); 

    # walk through main image 
    for($y = 0; $y < $main_img_obj_h; $y++) { 
     for($x = 0; $x < $main_img_obj_w; $x++) { 
      $return_color = NULL; 


      # determine the correct pixel location within our watermark 
      $watermark_x = $x - $main_img_obj_min_x; 
      $watermark_y = $y - $main_img_obj_min_y; 

      # fetch color information for both of our images 
      $main_rgb = imagecolorsforindex($main_img_obj, imagecolorat($main_img_obj, $x, $y)); 

      # if our watermark has a non-transparent value at this pixel intersection 
      # and we're still within the bounds of the watermark image 
      if ( $watermark_x >= 0 && $watermark_x < $watermark_img_obj_w && 
         $watermark_y >= 0 && $watermark_y < $watermark_img_obj_h) { 
       $watermark_rbg = imagecolorsforindex($watermark_img_obj, imagecolorat($watermark_img_obj, $watermark_x, $watermark_y)); 

       # using image alpha, and user specified alpha, calculate average 
       $watermark_alpha = round(((127 - $watermark_rbg['alpha'])/127), 2); 
       $watermark_alpha = $watermark_alpha * $alpha_level; 

       # calculate the color 'average' between the two - taking into account the specified alpha level 
       $avg_red  = $this->_get_ave_color($main_rgb['red'],  $watermark_rbg['red'],  $watermark_alpha); 
       $avg_green = $this->_get_ave_color($main_rgb['green'], $watermark_rbg['green'], $watermark_alpha); 
       $avg_blue  = $this->_get_ave_color($main_rgb['blue'], $watermark_rbg['blue'],  $watermark_alpha); 

       # calculate a color index value using the average RGB values we've determined 
       $return_color = $this->_get_image_color($return_img, $avg_red, $avg_green, $avg_blue); 

      # if we're not dealing with an average color here, then let's just copy over the main color 
      } else { 
       $return_color = imagecolorat($main_img_obj, $x, $y); 

      } # END if watermark 

      # draw the appropriate color onto the return image 
      imagesetpixel($return_img, $x, $y, $return_color); 

     } # END for each X pixel 
    } # END for each Y pixel 

    # return the resulting, watermarked image for display 
    return $return_img; 

} # END create_watermark() 

# average two colors given an alpha 
function _get_ave_color($color_a, $color_b, $alpha_level) { 
    return round((($color_a * (1 - $alpha_level)) + ($color_b * $alpha_level))); 
} # END _get_ave_color() 

# return closest pallette-color match for RGB values 
function _get_image_color($im, $r, $g, $b) { 
    $c=imagecolorexact($im, $r, $g, $b); 
    if ($c!=-1) return $c; 
    $c=imagecolorallocate($im, $r, $g, $b); 
    if ($c!=-1) return $c; 
    return imagecolorclosest($im, $r, $g, $b); 
} # EBD _get_image_color() 

} # END watermark API 
?> 

<?php 

# include our watermerking class 
include 'api.watermark.php'; 
$watermark   = new watermark(); 

# create image objects using our user-specified images 
# NOTE: we're just going to assume we're dealing with a JPG and a PNG here - for example purposes 



$imgtype = exif_imagetype ($_GET['main']); 

if($imgtype === 3){ 
$main_img_obj    = imagecreatefrompng($_GET['main']); 
}else if($imgtype === 2){ 
$main_img_obj    = imagecreatefromjpeg( $_GET['main']); 
}else if($imgtype === 1){ 
$main_img_obj    = imagecreatefromgif( $_GET['main']); 
}else if($imgtype === 6){ 
$main_img_obj    = imagecreatefrombmp( $_GET['main']); 
} 



$watermark_img_obj = imagecreatefrompng( $_GET['watermark']); 

# create our watermarked image - set 66% alpha transparency for our watermark 
$return_img_obj   = $watermark->create_watermark($main_img_obj, $watermark_img_obj, 30); 

# display our watermarked image - first telling the browser that it's a JPEG, 
# and that it should be displayed inline 
if(($imgtype === 3)or($imgtype === 2)){ 
header('Content-Type: image/png','Content-Type: image/jpeg'); 
}else if(($imgtype === 1)or($imgtype === 6)){ 
header('Content-Type: image/gif','Content-Type: image/bmp'); 
} 

header('Content-Disposition: inline; filename=' . $_GET['src']); 
imagejpeg($return_img_obj, '', 50); 

?> 
+0

これらの画像はどれくらいの大きさですか? (次元はどういう意味ですか?)また、アップロード中に、すべての画像を共通の形式(IE jpegまたはgif)に変換することをお勧めします。 – BenOfTheNorth

+0

アップロード時に最大幅800pxにリサイズします。アップロード時に処理時間がかかるだけで、ウォーターマーキングに最適なものは何でもありません。私は今からjpgに画像を変換することができますが、私は95%がjpgだと言うでしょうが、既にシステムにたくさんあると思います。 – Ash

+0

ファイルタイプについて言う理由は、それらがすべて1つのタイプであれば、開始のために。 – BenOfTheNorth

答えて

0

あなたはおそらく毎回再利用する透かし入り画像をキャッシュしていないと思います。

私はPHPがこの種の作業に使用するツールではないと考えています。私はあなたがこれを行うためにPHPで使用できる外部ライブラリを探します。 PHPはうまくいきますが、この種の作業には適していません。 PHPと他の言語との間で、(他の場所の中でも)多くのメモリ/ CPU集中型タスクの相対的なパフォーマンスをチェックすることができます。

http://benchmarksgame.alioth.debian.org/u32/compare.php?lang=gcc&lang2=php

0

あなたはGD imagecopymerge代わりの画素に反復を使用する必要があります。キャッシュされた画像にPHPを呼び出さないように、.htaccessベースのリダイレクトを使用する場合は、結果をキャッシュします(ボーナスポイント)。

関連する問題