2013-05-21 72 views
0

我正在使用PHP寫圖片上的圖片。我很容易從當前圖片創建新圖片並使用PHP寫文本。但我也希望當我點擊應用更改時,將這個新圖片移動到我的目錄(move_uploaded_file)並用新圖像替換當前圖像,新圖像名稱必須與之前圖像相同,因爲我正在使用PHP下載它。從@imagecreatefromjpeg獲得<img>標記?

這是我用來寫它的代碼。

HTML代碼:

 <img id="image" src="<?php echo "upload_pic/" . $_FILES["image_file"]["name"]; ?>" alt="your_image" /> 
     <input type="button" name="save_image" id="save_image" value="Save Image" /> 
<input type="hidden" id="hidden_image_name" name="hidden_image_name" value="<?php echo $_FILES["image_file"]["name"]; ?>" /> 

jQuery代碼:

jQuery('#save_image').click(function(){ 
     var image_name = jQuery('#hidden_image_name').val(); 
     jQuery.ajax({ 
     url:'text_image.php', 
     data:'file='+image_name, 
     type:'get', 
     success:function(data){ 
      alert(data); 
     } 
    }); 
    }); 

text_image.php

<?php 

$file = 'upload_pic/'.$_GET['file']; 

/*** set the header for the image ***/ 
    header("Content-type: image/jpeg"); 

    /*** specify an image and text ***/ 
    $im = writeToImage($file, 'PHPRO rules again'); 
    //echo $im; 
    /*** spit the image out the other end ***/ 
    imagejpeg($im); 

    /** 
    * 
    * @Write text to an existing image 
    * 
    * @Author Kevin Waterson 
    * 
    * @access public 
    * 
    * @param string The image path 
    * 
    * @param string The text string 
    * 
    * @return resource 
    * 
    */ 
    function writeToImage($imagefile, $text){ 
    /*** make sure the file exists ***/ 
    if(file_exists($imagefile)) 
     {  
     /*** create image ***/ 
     $im = @imagecreatefromjpeg($imagefile); 

     /*** create the text color ***/ 
     $text_color = imagecolorallocate($im, 233, 14, 91); 

     /*** splatter the image with text ***/ 
     imagestring($im, 6, 25, 150, "$text", $text_color); 
     } 
    else 
     { 
     /*** if the file does not exist we will create our own image ***/ 
     /*** Create a black image ***/ 
     $im = imagecreatetruecolor(150, 30); /* Create a black image */ 

     /*** the background color ***/ 
     $bgc = imagecolorallocate($im, 255, 255, 255); 

     /*** the text color ***/ 
     $tc = imagecolorallocate($im, 0, 0, 0); 

     /*** a little rectangle ***/ 
     imagefilledrectangle($im, 0, 0, 150, 30, $bgc); 

     /*** output and error message ***/ 
     imagestring($im, 1, 5, 5, "Error loading $imagefile", $tc); 
     } 

    return $im; 
    } 
?> 

在先進的感謝!

+0

我檢查響應這是非常複雜的JFIF> CREATOR:GD-JPEG V1.0(使用IJG JPEG V62),默認質量 Ç\t \t $。' 」,#(7),01444'9 = 82 <.342C \t \t \t 2 !! 22222222222222222222222222222222222222222222222222" \t }!1AQa「Q2#BR $ 3房 – CuteBabyMannu

+2

這不是‘複雜’,這正是一個JPEG圖像看上去,當你在文本模式下查看等。 – Spudley

+1

另外,要小心使用'$ _FILES [「image_file」] [「name」] - 因爲文件的名字由客戶端決定,所以它有可能被用作攻擊媒介。包含斜線,你的代碼可能會加載一個不同的文件到你期望的文件中,你應該確保你在使用之前對它進行了清理,或者根本不使用它(即爲你上傳的文件構建你自己的名字)。 – Spudley

回答

0

我會發送一個XMLHttpRequest(AJAX)與jQuery,因爲​​ 不保存。用戶可以返回瀏覽器歷史記錄並再次訪問該網站。

另外,我認爲你沒有改變文件名。 move_uploaded_file($im,"upload_pic/angelina.jpg");

小提示:不要在函數之前使用@運算符!這是一個性能殺手。

+0

這只是我正在檢查的文本編寫代碼。我將使用AJAX來做到這一點。 – CuteBabyMannu

+0

如何移動這個文件,因爲這將是這個新創建的文件的名稱,這將是我已經更新了我的代碼爲Ajax – CuteBabyMannu

+0

,但它不工作 – CuteBabyMannu

1

您想要在更改時重新加載IMG源。所以,你需要做的就是更換IMG標記的SRC=值,加上空查詢,以避免緩存:

jQuery('#save_image').click(function(){ 
    var image_name = jQuery('#hidden_image_name').val(); 
    jQuery.ajax({ 
    url:'text_image.php', 
    data:'file='+image_name, 
    type:'get', 
    success:function(data){ 
     jQuery('#image').attr('src', jQuery('#image') 
      .attr('src')+'?'+Math.random()); 
    } 
}); 
}); 

腳本需要輸出什麼的PHP,剛剛改寫圖像文件

<?php 

    $file = 'upload_pic/'.$_GET['file']; 
    $im = writeToImage($file, 'PHPRO rules again'); 

    imageJPEG($im, $file, 95); // 95% quality 

    die(); 

    ... 
?> 

儘管如此,您可能希望輸出JSON,指出「成功」或「失敗」。

您還想檢查$_GET['file']是有效的,可訪問的,允許的圖像。例如,你可能會迫使該文件是一個基本名稱:

$file = 'upload_pic/'.basename($_GET['file']); 
    if (!file_exists($file)) 
     // ...no such file... 
    if (false === getImageSize($file)) 
     // ...doesn't look like an image... 
    // etc. 

另一種方式

如果你想保留原件和「字幕」的形象,你需要create a new file,因此輸出的新名字以jQuery可以替換SRC屬性。

例如:

$new = 'upload_pic/'.uniqid().'.jpg'; 

    ...create the file and put $im into it, as above... 

    Header('Content-Type: application/json;charset=utf8'); 
    die(json_serialize(array("src" => $new))); 
    // Or if you don't want json_serialize (BUT THEN $new may only contain printable ASCII-7 characters that need no escaping. "[a-z][0-9]-_." if you want to be sure). 
    die("{\"src\":\"{$new}\"}"); 

jQuery中,data將現在包含$new,所以:

success:function(data){ 
     jQuery('#image').attr('src', data.src); 
    } 

(在頁面中,您可能需要更新等領域,如果你想重新標題已標題圖像)。

+0

我使用你的第一個方式不對tmp_name – CuteBabyMannu

+0

如果你調用會發生什麼來自瀏覽器的PHP腳本(即不通過AJAX)具有相同的'file ='參數值?這應該給出一些提示,指出發生了什麼問題。 – LSerni

+0

@iserni第一種方式工作正常... :)謝謝它,但我想kepp文件原來和新的,所以我使用第二種方式,但在第二種方式新圖像創建,但這個圖像是空白。 我只是在** text_image.php **中更改此代碼** '$ unique_id = rand(); jQuery('#image')。attr('src',data);''''''''''';''''''''''';' 並在主文件中的此代碼 ' – CuteBabyMannu