PHPでリソースを引数で処理する方法とは?

このQ&Aのポイント
  • PHPの勉強中に、GDを使用した画像処理で同じような処理を行いたいと考えています。しかし、リソースを引数として処理する方法について試行錯誤してもうまくいきません。どのようにすればリソースを引数で処理することができるのでしょうか?
  • imagecreatetruecolor関数で作成したリソースを引数として、back_color_set関数で処理を行いたいです。しかし、正常に動作しません。どのような点に注意すればよいでしょうか?
  • back_color_set関数の処理は正常に動作したソースを編集して関数化したものです。リソースの引数をうまく処理するためには、どのような書き方が適切なのでしょうか?
回答を見る
  • ベストアンサー

ユーザー関数でのリソースを引数で処理

お世話になります。 今PHPの勉強をしております。 PHPでGDを使用した画像処理で同じような処理をさせる部分があるので 関数を作成して処理させたいと思っているのですが、引数でリソースを 渡して処理することは出来るのでしょうか。 試行錯誤しながら色々やってみましたがうまくいきませんでした。 $image_data = @imagecreatetruecolor($x, $y); back_color_set($image_data); function back_color_set($data) { /* この部分の処理は正常動作したソースをコピーしてきて編集 */ $back_color = imagecolorallocate($data,255,255,255); imagefilledrectangle(data, 0, 0, $view_x, $view_y, $back_color); } 所々省略しておりますが正常動作したソースを関数化しただけです。 宜しくお願いします。

  • ori08
  • お礼率73% (42/57)
  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.1

変数のデータ型の問題ではなく、通常の関数では、変数の中身を渡すだけなので、関数内でそれを書き換えても、元の変数の内容は変更されません。 これを変更可能にする方法が「リファレンス渡し」です。関数宣言の方を、リファレンスを受け取るように書き換えます。 php5以降なら、呼び側は、foo($var) で十分です。 function foo(&$var) $var 変更 } imagefilledrectangle などの関数はこの方法で作られています。 もう一つの方法は、関数の最後に変更したデータをreturn して、再度元の変数に代入します。 function change($im){ /* $im 変更 */ return $im; } $image = change($image); 文字列操作関数は、こちらの方法が多いです。

参考URL:
http://php.benscom.com/manual/ja/language.references.pass.php
ori08
質問者

お礼

ありがとうございました。 問題解決できました。

関連するQ&A

  • phpのImageColorAllocate関数について

    PHPではじめてGDライブラリについて勉強していますが、どうも合点がいかないところがあります。以下、ソースです。 $image = ImageCreate(100, 100); *1 $black = ImageColorAllocate($image, 0, 0, 0); $white = ImageColorAllocate($image, 255, 255, 255); *2 ImageString($image, 5, 5, 5, 文字, $white); イメージクリエイト関数でイメージの土台を作成します。その後、ImageColorAllocate関数で第一の引数に$image(イメージクリエイト関数で作成したイメージオブジェクト?)を指定していますが、これはイメージオブジェクトに関連付けるということなんでしょうか? また、上記ソースで文字列が白になるのはImageString関数で$whiteをしているから理解できますが、画像の背景色が勝手に最初にImageColorAllocate関数で指定した色になるのが理解できません。どこにもそんな命令自体が書いてないと思いますが・・ 初歩的だと思いますが、ネットや持っている書籍をみても載っていませんでした。 分かるかた、ご回答よろしくお願いします。

    • ベストアンサー
    • PHP
  • 画像描画と一般の関数は同じphpファイルには書けないのでしょうか?

    画像描画と一般の関数は同じphpファイルには書けないのでしょうか? 再びお世話になります。 phpで100以下の素数の数だけ、四角い黒い画像を横に並べて表示としています。 できれば、素数の数字の中身を画像の中に書き込めれば良いのですが、 どうしても文字化けなどしてうまくいきません。 以下のソースを打つと、黒い図形のみが表示されます。 どのように解決したらよいでしょうか?お願いいたします。 コードは以下のようになります(ご参考までに) <?php function draws() { header ("Content-type: image/png"); $image = imagecreatetruecolor(30,35); $bcolor = imagecolorallocate($image, 255,255,255); $fcolor = imagecolorallocate($image, 0,0,0); imagepng($image); imagecolordeallocate($image, $bcolor); imagecolordeallocate($image, $fcolor); imagedestroy($image); } function testprint1() { for ($i = 0; $i < 100; $i++) { printf("%d\n", $i); } } function testprint2() { printf("333333333333333333333333333333333333"); } draws(); testprint1(); testprint2(); ?>

    • ベストアンサー
    • PHP
  • イメージ関数の使い方について

    ローカルテスト環境で、簡易画像掲示板を自分で作ってみたいと思い、まずimage関数がどういったものかphpマニュアルで見てました。 imagecreatetruecolor()を調べていて、実際どんなものか動かしてみようと思い、マニュアルのサンプルコードのメッセージ部分だけ変えてやってみました。以下がコードの内容です。 <?php header ("Content-type: image/png"); $im = @imagecreatetruecolor(120, 20) or die("新しいイメージストリームを作成できませんでした。"); $text_color = imagecolorallocate($im, 233, 14, 91); imagestring($im, 1, 5, 5, "ここが表示されるテキスト", $text_color); imagepng($im); imagedestroy($im); ?> しかし、これを実行してみても画像が×印になって表示されません。 imagecreatetruecolor()とかimagepng()とかちゃんと動いているのかと思い、自分なりに確認してみようと、コードを少し変えました。 まずimagecreatetruecolor()は成功時に画像リソースIDを返すと書いてあったのでprint文で出力して確認できないかと思いやってみました(返される値がarrayとかstoringじゃないので、出力できないのではと思いましたがとにかくやってみました。) つぎにimagepng()は失敗した場合に FALSE を返すって書いてあったので、失敗したら"false"と出力させてみようと思いました。 以下がそのコードです。 <?php header ("Content-type: image/png"); $im = @imagecreatetruecolor(120, 20) or die("新しいイメージストリームを作成できませんでした。"); print($im); $flag=imagepng($im); if($flag==false){ print("false");} imagedestroy($im); ?> これを試してみましたが、出力結果は同じでした。 なんか反応があるかもとおもい、一応imagecreatetruecolor(120, 20)の前の@マークをはずしてみたりもしましたが別にエラーが表示されるわけでもなく、ただ画像が表示されないだけです。 phpinfoのgdのところは、 GD Support enabled GD Version bundled (2.0.34 compatible) FreeType Support enabled FreeType Linkage with freetype FreeType Version 2.1.9 T1Lib Support enabled GIF Read Support enabled GIF Create Support enabled JPG Support enabled PNG Support enabled WBMP Support enabled XBM Support enabled になっています。 php.iniのmemory_limit は32Mになってます。memory_limitを-1にしたらちゃんと表示されるかもと思ったのですがやはり×印のままでした。 C:\xampp\php\extの中にphp_gd2.dllがあるのも一応確認しました。 動作環境はwindows vistaにxampp1.6.5で、phpのバージョンは5.2.5です。マニュアルを見た限りでは、windowsではphp.iniのphp_gd2.dllのコメントを外すだけでちゃんと動作すると思っていたのですが、他に抜けていることがありましたらアドバイスをお願いします。

    • ベストアンサー
    • PHP
  • PHPのGD関数を用いた文字出力について

    以下の、PHPのGD関数を用いたスクリプトにおいて、「男女別表示」という 文字が出力されません。どこが間違っているのか教えていただきたいです。 ちなみに、MSゴシックのフォントは、自パソコンの中に存在しています。 <?php $im = imagecreatetruecolor(601, 801); // 1ピクセル多めなキャンバスを作る // タイトル $font = "c:\windows\fonts\msgothic.ttc"; $jstr="男女別表示"; $jstr=mb_convert_encoding($jstr, "utf-8", "auto"); $color = imagecolorallocate($im, 0, 0, 0); imagettftext($im,100,30,150,45,$color,$font,$jstr); // 出力し、メモリを開放します header('Content-type: image/png'); imagepng($im); imagedestroy($im); ?>

    • ベストアンサー
    • PHP
  • GD(php)での image関数 イメージ関数でブラウザ出力が出来ない

    下記ソースのimage.phpというファイルを作りました。 直接http://url/image.phpでアクセスすると画像が表示されません。 <? header("Content-Type: image/png"); $image = imagecreate(120,120); $black = imagecolorallocate($image,0,0,128); $yellow = imagecolorallocate($image,255,255,0); imageline($image,10, 60, 110, 60, $yellow); imagepng($image); imagedestroy($image); ?> imagepng($image);を imagepng($image,"test.png"); に変えたら、正しく同フォルダーにtest.pngが出力され、こちらは問題ないファイルとなっています。今回の処理ではphpを画像ファイルとして扱いたいのですが、 このケースで考えられる原因教えてください。 参考までにtest.htmlに <html><head><title>test</title> <img src="image.php"></body></html> と書いても結果は同じく画像表示が出来ませんでした。 <html><head><title>test</title> <img src="test.png"></body></html> では表示出来ます。

    • 締切済み
    • PHP
  • image関数で単色別サイズの画像を大量生成したい

    PHPのimage関数についての質問です graphディレクトリ内に、length:30px、color:(160,160,160)でwidthが異なる画像を大量生成しようと思います。 具体的にはwidth:1pxから2px、3px…と増えていき、30pxまで増えます。 ファイル名はwidth:1pxなら1graph.png、5pxなら5graph.png、などと名前を変えるものとして、以下のコードを作りました。 <?php for($i=1;$i<=30;$i++){ //画像のパスを生成 $gazou_path = "./graph/".$i."graph.png"; //画像の作成 $img = imagecreate($i, 25); //色の作成(背景色) $backcol = imagecolorallocate($img, 160, 160, 160); //背景色を塗る imagefilledrectangle($img, 0, 0,1, 25, $backcol); //画像出力 header("Content-type: image/png"); header("Cache-control: no-cache"); imagepng($img, "$gazou_path"); } ?> image関数自体、使用するのは今回が初めてで、 いろいろ調べてこのようなコードを作成してみたのですが、正常に動作いたしません。 create.phpというファイル名をつけて動作させてみましたが、 画像ファイル "http://localhost/create.php" は壊れているため、表示できませんでした。 というエラーが出てきます。 このような動作を行いたいのですが、正常に動作するコードをどなたか教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP GD 画像リサイズ

    PHP+GDで携帯サイト用の画像リサイズ処理させるプログラムを書籍のサンプルプログラムを元に作成していますが画像が表示されません。 GD:ver2.17 $image_data = @imagecreatefromjpeg($image_file); $output_image_data = @imagecreatetruecolor($output_image_x, $output_image_y); @imagecopyresampled($output_image_data, $image_data, 0, 0, 0, 0, $output_image_x, $output_image_y, $image_x, $image_y); header('Content-Type: image/jpeg'); @imagejpeg($output_image_data); @imagedestroy($image_data); @imagedestroy($output_image_data); 動作確認は携帯とPC両方でやってますが、携帯だと画像表示されず×が表示され、PCだと文字化けした文字が出力されます。 PCで所々デバック文を表示させたりして確認したところimagecopyresampled関数ではTRUEが返ってきておりましたが、imagejpeg関数以降のデバック文が表示しませんでした。 初心者なのでうまく説明できなくてすいません。 お手数ではございますがご教授お願いします。

    • ベストアンサー
    • PHP
  • PHPでJavascriptの引数の扱い方

    はじめまして。宜しくお願い致します。 環境:Linux(Redhat 9), apache2, PHP4.3.6 [やりたいこと] 下記↓ソース内容↓より、input=button と input=text が幾つかある。 個々のボタンが押されたら、PHPにて"個々"の内部処理を行う。 内部処理終了後は、個々のテキストにインクリメントした値が画面表示される。 HTML+Javascript にて、カウンター部分は一応完成しています。 ↓ソース内容↓ <html> <head> <script language="JavaScript"> <!-- function ccc(obj0) { cnt = obj0.value; cnt++; obj0.value = cnt; } // --> </script> </head> <body> <form name="ose"> <input type="text" name="view0" readonly size=5 maxlength=3> <input type="button" value="押せ0" onClick="ccc(view0)"><br> <input type="text" name="view1" readonly size=5 maxlength=3> <input type="button" value="押せ1" onClick="ccc(view1)"> </form> </body> </html> コレをPHPに書き換えると、上手くいきません。 ↓PHPに書き換えた場合↓ <script type="text/javascript"> <!-- function ccc($obj0) { cnt = $obj0.value; cnt++; $obj0.value = cnt; } // --> </script> 引数に付いている "$"マークをJavascript側で認識しないのだろう、と考えています。 出来れば、PHPで単体の関数として使用したい為、模索中です。 ※現在は、別の関数の中に上記の『↓HTML+Javascriptの場合↓』を無理矢理入れて使用しています。(別の関数:HTMLをPHPファイルに書き込む) 別の関数内に入れてても問題は無しです。 但、上記のJavascriptを使用しないソース達にも書き込んでしまうので、ちょとやだなーと。 いい方法があったら教えて下さい。

    • ベストアンサー
    • PHP
  • 【php】コールバック関数ってなんですか?

    【php】コールバック関数ってなんですか? コールバック関数ってどういうものなのでしょうか? 個人的になイメージでは このライブラリの、このボタンを押した時 hoge()という関数が実行されるように設計しておいたから ボタンを押した時に何か動作が必要な場合は hoge()という名前で関数を定義しておいてね。 みたいな感じでしょうか?

    • ベストアンサー
    • PHP
  • ユーザ関数の呼び出し方法 その2

    ユーザ関数の呼び出し方法 http://oshiete1.goo.ne.jp/qa3567728.html で、質問をさせて頂いた者です。 お陰様で、だいぶ出来てきました。 frameで左右に分かれています。 「左がメニュー画面」 「右がデータを表示する画面」 メニュー用のPHPに //処理部分 <?php if($_GET["mode"] == 1){ //処理1のスクリプト include("./ee.php"); ads(); } と、しました。 そうすると 左のメニュー画面にデータが表示されてしまいます。 右のデータを表示する画面に更新したい場合 どのように書けば宜しいですか? --------------- <frame name="hidari" src="aa.php"> <frame name="migi" src="ee.php">

    • ベストアンサー
    • PHP

専門家に質問してみよう