フォルダ内jpg画像を一括回転させ別フォルダに保存 - PHPプロ!Q&A掲示板

1513

  • 0P

フォルダ内jpg画像を一括回転させ別フォルダに保存

質問日時 / 2008年9月22日 22:29    回答数 / 7件

Questioner:  washi  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません

初めて質問させてください
携帯用に縦長で横向きの画像してhtmlで表示させようとしているのですが
1個のファイルは マニュアルで以下を参考にすれば良いということまで解ったんですが
  1. header('Content-type: image/jpeg');
  2. $source = imagecreatefromjpeg($filename);
  3. $degrees = 270;
  4. $rotate = imagerotate($source,$degrees, 0);

data1 というフォルダ内全部の jpg ファイルを一括して回転させ
data2 というフォルダに保存させたいのですが
どなたか、PHPスクリプトを教えていただけないでしょうか??
よろしくお願いいたします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01tezcello全体の流れは、 ファイルの読み出し 回転する画像
┗A02washiありがとうございます。 他の例を参考に <?php /
 ┗A02-1tezcello> このようにしたのですが、どうでしょうか? この
  ┗A02-1-1washi申し訳ございません  // 縮小後の画像を保存するデ
   ┗A02-1-1-1tezcello> 画像サイズ変更のを応用できないか としてみたので
    ┗A02-1-1-1-1tezcello環境を変えてテストしてみました。 特に問題なく動作
     ┗A02-1-1-1-1-1washiありがとうございます 希望通りの動作で満足です。

回答一覧

並び替え:

A01
answerertezcello [9月22日 23:38]

全体の流れは、

ファイルの読み出し
回転する画像の作成(例示スクリプトの 2 〜 4 ですね)
画像データの保存
これを元データフォルダ(data1)の全ての .jpg ( .jpeg ) について行うまでループ

こんな感じだと思います。

どこがわかりませんか?

この意見に回答する

ツリーへ TOPへ

A02
answererwashi [9月23日 10:51]

ありがとうございます。
他の例を参考に

<?php
// ここにJPEGファイルを保存してあるディレクトリを指定しておく
define(ScanDir, './data1');

// 縮小後の画像を保存するディレクトリを指定

define(SaveDir, './data2');

//============================================================================
// ディレクトリ一覧を取得して、$dirs[]の配列に保存する
$dirs[0] = ScanDir;
for ($i = 0; $i < count($dirs); $i++) {
GetDir($dirs[$i]);
}

// サブ・ディレクトリを取得して$dirs[]に要素を追加
function GetDir($path) {
global $dirs;

if (!($dir = @opendir($path))) return;
while ($fname = readdir($dir)) {
if ($fname != '.' && $fname != '..') {
if (is_dir("$path/$fname")) {
$dirs[count($dirs)] = "$path/$fname";
}
}
}
closedir($dir);
}

// すべての画像を回転してファイルへ保存
for ($i = 0; $i < count($dirs); $i++) {
if ($dir = @opendir($dirs[$i])) {
// ディレクトリ内の全JPEGファイルを取得する
while ($fname = readdir($dir)) {
if ($fname != '.' && $fname != '..') {
if (is_file($dirs[$i] . "/$fname")) {
$ex = explode('.', $fname);
$ext = strtolower($ex[count($ex) - 1]);
if ( count($ex) > 1 && ($ext == 'jpg' || $ext == 'jpeg') ) {
// JPEG画像を回転
$source = imagecreatefromjpeg($filename); 
$degrees = 270;
}
}
}
}
closedir($dir);
}
}

// 保存するディレクトリを生成

$outdir = SaveDir . "/" . mb_substr($dirname, mb_strlen(ScanDir));
if (!is_dir($outdir))
mkdir($outdir);

// サイズ変更後の画像をファイルへ保存
$ex = explode('.', $fname);

$outfile = $outdir . "/" . $ex[0] .  "." . $ex[1];

// メモリーの解放
ImageDestroy($im_inp);
ImageDestroy($im_out);
$jpg[count($jp
?>
このようにしたのですが、どうでしょうか?

この意見に回答する

ツリーへ TOPへ

A02-1
replyertezcello [9月23日 13:54]

> このようにしたのですが、どうでしょうか? 
このスクリプトは、エラーで実行できないですよね?
  未定義の変数がある $dirname, $im_inp, ...
  スクリプトの最後が尻切れになっている(書きかけ?)


まずはやりたい事の確認です。
・画像ファイルはどこにある?(例示のスクリプトによると2番目?)
  data1 ディレクトリの直下に全てある
  data1 ディレクトリに存在するディレクトリの下(./data1/hoge/fuga.jpg のような形)
  data1 ディレクトリ以下のどこか(階層不明)

・ディレクトリ名、ファイル名には漢字が含まれる?
  実行するシステムにより漢字のエンコードが異なる


疑問点がたくさんあるので、今回はここまで。

この意見に回答する

ツリーへ TOPへ

A02-1-1
replyerwashi [9月23日 18:22]

申し訳ございません 
// 縮小後の画像を保存するディレクトリを指定
define(SaveDir, './data2');
これ、まちがってました。
// 回転後の画像を保存するディレクトリを指定
define(SaveDir, './data2');
で、data2 の直下です。

>・画像ファイルはどこにある?(例示のスクリプトによると2番目?)
>  data1 ディレクトリの直下に全てある
>  data1 ディレクトリに存在するディレクトリの下(./data1/hoge/fuga.jpg のような形)
>  data1 ディレクトリ以下のどこか(階層不明)
元画像は data1 の直下です ./data1/fuga.jpg のように

>・ディレクトリ名、ファイル名には漢字が含まれる?
>  実行するシステムにより漢字のエンコードが異なる
漢字はありません 全て 半角英数字です。

画像サイズ変更のを応用できないか としてみたのでまちがいだらけでしたか
よろしくご指導くださいませ。

この意見に回答する

ツリーへ TOPへ

A02-1-1-1
replyertezcello [9月23日 22:22] (最終編集:9月24日 08:15)

> 画像サイズ変更のを応用できないか としてみたのでまちがいだらけでしたか
既存のコードを流用する場合は、何がどうなっているのかを理解して使わないとエラーの嵐となります。

例えば、サブディレクトリを取得したりする部分は今回は全く不要だった訳ですし。
  サブディレクトリ以下にファイルがあるなら、僕なら再帰で書くと思います。
  ディレクトリ一覧の取得辺りも、ループ内で終了条件に使う変数を
  変更してしまうような見通しの悪いのは避けると思います。


パッと見で理解し易い方がメインテナンスも楽なので、一旦全ての元画像ファイル名を配列に入れてそれでループを回し、それぞれ処理する事にします。

手元の環境では、image***() は使えないので、動作は未検証です。ごめんなさい。
ですが、画像を取り込んで回転し、出力は出来ているのでしょうから、大丈夫ですよね?
ファイルに出力するには、imagejpeg() で第2引数でファイル名を指示するだけのようです。
(ファイルに出力するのだから、header() は不要です。)

  1. define("ScanDir", 'data1/'); // 加工前ディレクトリ
  2. define("SaveDir", 'data2/'); // 加工後ディレクトリ
  3.  
  4. // 元画像ファイル名を配列に収める
  5. // 拡張子は、.jpg であるものと仮定します。
  6. // それ以外の場合は下の '*.jpg' 内を合わせてください。
  7. $files = glob(ScanDir.'*.jpg');
  8.  
  9. foreach ($files as $f){  // 全要素(=元画像ファイル)について以下の処理を行う
  10.  
  11.   // 保存用のファイル名を求める。
  12.   // 元画像ファイル名の加工前ディレクトリを加工後ディレクトリに付け替える事で作成する
  13.   // ScanDir をエスケープしてから使うのが正解(今回不適当な文字は無いので省略)
  14.   $newfname = preg_replace('|^'.ScanDir.'|', SaveDir, $f);
  15.  
  16.   // 画像を取り込む
  17.   $src = imagecreatefromjpeg($f);
  18.  
  19.   // 90°回転する
  20.   $rot = imagerotate($src, 270, 0);
  21.  
  22.   // 画像を書き出す
  23.   imagejpeg($rot, $newfname);
  24.  
  25.   // 画像を破棄
  26.   imagedestroy($src);
  27.   imagedestroy($rot);
  28. }

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1 満足
replyertezcello [9月24日 08:43]

環境を変えてテストしてみました。
特に問題なく動作したようです。
普段画像を扱う事は無いので気が付かなかったのですが、Winでは .jpg .JPG .jpeg .JPEG と拡張子がいろいろなんですねぇ。統一されていないようでしたら以下をお試しください。
  1. $files = glob(ScanDir.'*.{jpg,JPG,jpeg,JPEG}', GLOB_BRACE);

また、今回は不要でしたが「再帰で書く」といっている部分もついでにサンプルを示します。
文句を言うだけではナンですので...
  1. define("ScanDir", 'data1/'); // 加工前ディレクトリ
  2. $files = array(); // 結果リスト
  3.  
  4. getfiles(ScanDir, $files);
  5.  
  6. function getfiles($name, &$l){
  7.  
  8.   // 今注目している階層直下の全てについて調べる
  9.   foreach (glob($name.'*', GLOB_MARK) as $n){
  10.  
  11.     // ディレクトリだったらその中身について調べる
  12.     if (is_dir($n)) getfiles($n, $l);
  13.  
  14.     // 探しているファイルなら結果配列に追加する
  15.     if (preg_match('/\.jpg$/i',$n)) $l[] = $n;
  16.   }
  17. }

この意見に回答する

ツリーへ TOPへ

A02-1-1-1-1-1
replyerwashi [9月24日 20:54] (最終編集:9月24日 20:55)

ありがとうございます 希望通りの動作で満足です。
今までは自宅サーバーでしたので以下のようにサーバー内でクロンで自動実行させていたのですが事情により外部サーバーにしたのでクロンも使えず、またPHPの勉強する時間がありませんでした。

#!/bin/sh

convert -rotate 90 /home/****/video1/*.jpg /home/****/video2/i.jpg

少しずつ勉強したいと思います。
【感謝申し上げます】

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)