1

アップロードされた画像を回転させるシステムに取り組んできました。アルゴリズムは次のように機能します。

 1) User uploads a jpeg.  It gets saved as a PNG
 2) Link to the temp png is returned to the user.
 3) The user can click 90left,90right, or type in N degrees to rotate
 4) The png is opened using 

   $image = imagecreatefrompng("./fileHERE");

 5) The png is rotated using

   $imageRotated = imagerotate($image,$degrees,0);

 6) The png is saved and the link returned to the user.
 7) If the user wishes to rotate more go back to step 3 operating on the newly
    saved temporary PNG, 
    else the changes are commited and the final image is saved as a jpeg.

これは、左右に 90 度回転するときに問題なく動作します。ユーザーは、品質を損なうことなく無限に何度も回転できます。問題は、ユーザーが 20 度 (またはその他の 90 度以外の角度) 回転しようとしたときです。20 度回転すると、画像がわずかに回転し、塗りつぶす必要のある領域を塗りつぶすために黒いボックスが形成されます。画像 (ブラック ボックスを含む) は png として保存されるため、次に 20 度回転すると、画像 (ブラック ボックスを含む) がさらに 20 度回転し、別のブラック ボックスを形成してたるみを吸収します。簡単に言うと、これを 360 度で行うと、残りの非常に小さな画像の周りに大きな黒いボックスが表示されます。ブラック ボックスをズームインしてトリミングしても、品質が著しく低下します。

ブラックボックスを回避する方法はありますか?(サーバーには imagick がインストールされていません)

4

1 に答える 1

5

ソース ファイルは常に変更せずに保存し、回転するときは、元のソース ファイルを使用して度数を回転させます。つまり、20 度 + 20 度は、ソースを 40 度回転させることを意味します。

  1. ユーザーが JPEG をアップロードします。
  2. ユーザーは、「90 左」、「90 右」をクリックするか、N度を入力して回転できます。
  3. pngは次を使用して開かれます

    $image = imagecreatefromjpeg("./source.jpg");
    
  4. PNGが回転しています...

    // If this is the first time, there is no rotation data, set it up
    if(!isset($_SESSION["degrees"])) $_SESSION["degrees"] = 0;
    
    // Apply the new rotation
    $_SESSION["degrees"] += $degrees;
    
    // Rotate the image
    $rotated = imagerotate($image, $_SESSION["degrees"], 0);
    
    // Save the image, DO NOT MODIFY THE SOURCE FILE!
    imagejpeg($rotated, "./last.jpg");
    
    // Output the image
    header("Content-Type: image/jpeg");
    imagejpeg($rotated);
    
  5. ユーザーがさらに回転させたい場合は、手順 3 に戻ります。それ以外の場合は、last.jpg が最終的なものとして取得され、$_SESSION["degrees"]パラメーターが破棄されます。

于 2012-10-15T13:56:45.053 に答える