2011-12-15 10 views
0

データベースから小さな部分の画像をカットしようとしています。ここに私のコード:PHPの文字列がintで動作しない

$image = imagecreatefromjpeg($filename); 
$width = $row['width']; 
$height = $row['height']; 
$new_width = 480; 
$new_height = 360;   
$offset_x = (int)(round($height*360/$width));//100 
$offset_y = 0; 
$new_image = imagecreatetruecolor($new_width, $new_height); 
imagecopy($new_image, $image, 0, 0, $offset_x, $offset_y, $width, $height); 
imagejpeg($new_image,$newimg); 

しかしライン$offset_xで、(int)(round($height*360/$width))が機能していません。 intvalを入れた場合、100のように、すべてimagesはうまくカットされますが、オフセット位置は喜ばしくありません。だからどのようにtrue string to intに?

ところで:この場合、foreachでデータベースから画像を呼び出して切り取ります。このコードの後に​​foreachでunsetを入力する必要がありますか?

+0

$行はどこに設定されていますか? $ heightと$ widthの値は何ですか? – ben

+0

多分try intval $ offset_x = intval(round($ height * 360/$ width)); http://fp.net/manual/en/function.intval.php – rogerlsmith

+0

@ben、 '$ height'、' $ width'から 'mysql query => $ row ['width']と$ row [']高さ '] '。 –

答えて

3

PHPで文字列を数値に変換する必要はほとんどありませんが、暗黙的にはそれほどよくありません。例えば、あなたのコードは、任意の追加の変換せずに正常に動作します:

<?php 
    $height = '100'; 
    $width = '200'; 
    $offset = round($height * 360/$width); 
    echo $offset; 
?> 

http://codepad.viper-7.com/LJEXIF

あなたが持つかもしれない問題を、それはあなたに正しい結果を与えていない場合には、業務の優先順位です。あなたのコード、

round($height * 360/$width) 

は、それが最初の$heightで結果を掛け、その後、$widthによって360を分割する

round($height * (360/$width)) 

のと同等です。それがあなたの望むものなら、あなたの問題は他の場所にあります。テスト変数を使用して問題を試してみてhttp://codepad.viper-7.comに再現し、ここに戻す必要があります。

+0

当初は除算は乗算の前に行われると思っていましたが、演算子の優先順位チャートhttp://php.net/manual/en/language.operators.precedence.phpによればそうではありませんか、それとも正しく読めませんか? –

+0

@Interstellar_Coderここでは、http://codepad.viper-7.com/xOcjTQで見ることができるように、演算の標準的な数学的優先順位、PEDMAS(括弧の指数除算の加算除算)に従います。そのチャートは誤解を招くほどのものです。上の要素は下の要素よりも優先されます。 「演算子」列内の要素の位置はランダムであるように見えます。 –

+0

AhhはいXeon、それはPEDMASに続いてうれしいですが、これは最初は私が疑ったものですが、チャートを見て、私は混乱してしまいました。ページには、その行の演算子列の中で、演算子が左から右の順に優先順位が付けられていると言われています。説明をありがとう。 –

関連する問題