第9回目SE勉強会@高蔵寺

921 回閲覧 このエントリーをはてなブックマークする この記事のブックマークユーザー 永続的リンク2008/06/22 22:10:30 カテゴリ: 勉強会
スポンサード リンク
勉強会

9回目の勉強会が開かれました。
内容は、

  • 宿題
  • 発表
  • 今後のネタの話し合い
  • ペアプロみたいなこと


宿題はソースを貼って長くなったので最後で。

[続き:]

発表

 自分は共通CSSのサンプルの発表をしました。
大雑把に作って、どんなのが必要か聞いて追加していくつもりだったけど、なんかもっと完成させておいた方がよかったのかな。


XML入門 パンダさんからの発表。
実際にXMLを使って、コンテンツを作成してきていました。
完成度も高くもう直ぐにお披露目するそうです。
宿題の画像のも絡めて作成されていて、見栄えもよくできていました!

ほ・ほしいな・・・。

今後のネタとペアプロ

今後のネタをどうするかについて、みんなで話し合いをしました。
プラグインとか、マッシュアップ企画への参加とか・・。


今回は、地域ホームページのコンテンツを作成するということで、

  1. 共通利用が出来る
  2. オーナーさんが利用可能
  3. 目標は公開し、利用できるトコまでもっていく

というもの。
採用されるかどうかもあるけど。
とりあえず、こういうことをどんどんやっていって内容を豊富にしていたい。
それと同時に自分たちも新しいことにどんどん挑戦してレベルアップしていけば、一石何丁にもなる。
20%の時間を利用して、

  1. 新しいことへの挑戦
  2. 他のエンジニアの支援

どんどん実践していきたい。


内容的に、実際に運営しているオーナーさんの声を聞いているトレーナーさん(さつさんかなえちゃんみうちゃん)に話しを聞くっていうのも大事かなと。
ブログにこういう機能がほしいとか、こんなコンテンツとか・・・。

宿題

☆PHPで画像を扱って何か作ってみよう。

です、出題者は自分。

b2evolutionのプラグインでフォトアルバムみたいなのをつくった。
中途半端だけど、とりあえず。
そのクラス↓

if( !defined('EVO_MAIN_INIT') ) die( 'Please, do not access this page directly.' );


class PhotoAlbum
{
    //写真のディレクトリ
    var $base_photo_dir  = "";
    //表示件数
    var $disp_max   = "15";
    //画像の横幅(px)
    var $width_max  = "150";
    //画像の縦(px)
    var $height_max = "150";
    
    /*
     * ファイルデータの取得
     */
    function getPhotoData()
    {
        clearstatcache();//ファイルシステム情報に関するキャッシュをクリア
        //ディレクトリハンドルをオープン
        if (($open_dir = @opendir($this->base_photo_dir)) != false){
            //ディレクトリハンドルからエントリーを読み込む
            $cnt = 0;
            while($f_data = readdir($open_dir)){
                //読み込むファイル(ここはまだ調整が必要)
                if($f_data != "." && $f_data != ".."){
                  //  $file[$cnt]["filesize"] = round(filesize($this->base_photo_dir.$f_data)/1024);//サイズの取得
                    $file[$cnt]["name"]     = $f_data;//ファイル名
                    $file[$cnt]["time"]     = filemtime($this->base_photo_dir . $f_data);//更新日
               }
               $cnt++;
            }
            closedir($open_dir);
            return $file;
        }
        return false;
    }
    
        
    /*
     * 画像ごとの切り分け操作
     */
    function imgOperation($file_path,$file_type)
    {
        header("Content-type: {$file_type}");
        switch ($file_type){
            case "image/jpeg" :
                $image = ImageCreateFromJPEG($file_path);//新規にJPEG 画像を作成する
                ImageJPEG($this->thumbnail($image));//Jpeg画像の出力
                break;
            case "image/gif" :
                $image = ImageCreateFromGIF($file_path);
                ImageGIF($this->thumbnail($image));
                break;
            case "image/png" :
                $image = ImageCreateFromPNG($file_path);
                ImagePNG($this->thumbnail($image));
            default :
                return false;
                break;
        }
    }
    
    /*
     * 画像のサムネイルを作成する
     */
    function thumbnail($image)
    {
        $width  = ImageSX($image); //横幅
        $height = ImageSY($image); //縦幅

        $rate = 1;
        //高さが指定高より大きい場合
        if($height > $this->height_max){
            $rate = $this->height_max / $height; //圧縮比
            //圧縮後の横幅が指定横より大きい場合
            if($rate * $width > $this->width_max){
                $rate = $this->width_max / $width;
            }
        }elseif($width > $this->width_max){
            $rate = $this->width_max / $width; //圧縮比
            //圧縮後の横幅が指定横より大きい場合
            if($rate * $height > $this->height_max){
                $rate = $this->height_max / $height;
            }
        }
        $new_height = ceil($rate * $height);//小数点以下は切り上げ
        $new_width  = ceil($rate * $width);
        
        //画像を新規作成
        $new_image = ImageCreateTrueColor($new_width, $new_height);

        //==透過PNG用==
        ImageAlphaBlending($new_image, false);//イメージのブレンドモードを設定
        //PNG 画像を保存する際に(単一色の透過設定ではない)完全な アルファチャネル情報を保存するフラグを設定する
        //この関数を利用するためには上のが必要
        ImageSaveAlpha($new_image, true);
        //画像で使用する色を透過度を指定して作成する
        $fillcolor = ImageColorAllocateAlpha($new_image, 0, 0, 0, 127);
        //$fillcolorで塗りつぶす
        ImageFill($new_image, 0, 0, $fillcolor);

        //再サンプリング(コピー・縮小)
        ImageCopyResampled($new_image,$image,0,0,0,0,$new_width,$new_height,$width,$height);
        
        return $new_image;
    }
    
    /*
     * 画像の出力
     */
    function imageCreate($img_file)
    {
        if($_REQUEST['width'] > 0)  $this->width_max  = $_REQUEST['width'];
        if($_REQUEST['height'] > 0) $this->height_max = $_REQUEST['height'];
        
        if(isset($img_file)){
            //ファイル存在したら
            if(file_exists($img_file)){
                $image_size = @getimagesize($img_file);
                $this->imgOperation($img_file,$image_size['mime']);
                exit;
            }
        }
        header("HTTP/1.0 404 Not Found");
        exit("404 Not Found");
    }
}


プラグイン用クラス


if( !defined('EVO_MAIN_INIT') ) die( 'Please, do not access this page directly.' );


class photo_album_plugin extends Plugin
{
    var $name = '写真アルバム';
    var $code = '16_photo_album';
    var $version = '0.5';
    var $author = 'MICK';
    
    /*
     * コンストラクタ
     */
    function photo_album_plugin() {
        $this->short_desc = T_('指定ディレクトリの写真を表示させます。');
        $this->long_desc = T_('指定したディレクトリの写真をサムネイル表示と拡大表示が可能になります。');
    }

    /*
     * 設定
     */
    function GetDefaultSettings()
    {
        $r = array(
            'photo_dir' => array(
                    'label' => T_('写真ディレクトリ'),
                    'size' => '45',
                    'defaultvalue' => '',
                    'note' => T_('表示する写真用のディレクトリ[例 : /a/photo_album/]'),
                ),
            'width_max' => array(
                    'label' => T_('横幅'),
                    'defaultvalue' => '150',
                    'note' => T_('サムネイル表示する写真の最大横幅(px)'),
                ),
            'height_max' => array(
                    'label' => T_('高さ'),
                    'defaultvalue' => '150',
                    'note' => T_('サムネイル表示する写真の最大高(px)'),
                ),
            'disp_max' => array(
                    'label' => T_('表示件数'),
                    'defaultvalue' => '15',
                    'note' => T_('1ページに表示する写真の件数'),
                ),
            );
        return $r;
    }

    /*
     * 出力
     */
    function SkinTag( $params )
    {
        global $basepath,$baseurl;
        
        //head内に出力
        if($params['mode'] == "head"){
            $lightbox = $baseurl . "plugins/photo_album_plugin/lightbox/";
            echo '<link rel="stylesheet" href="' . $lightbox . 'css/lightbox.css" type="text/css" media="screen" />' . "\n";
            echo '<link rel="stylesheet" href="' . $lightbox . 'css/photo.css" type="text/css" media="screen" />';
            echo '<script type="text/javascript" src="' . $lightbox . 'js/prototype.js"></script>';
            echo '<script type="text/javascript" src="' . $lightbox . 'js/scriptaculous.js?load=effects"></script>';
            echo '<script type="text/javascript" src="' . $lightbox . 'js/lightbox.js"></script>';
            return true;
        }
        
        //写真のディレクトリ
        if( ($photo_dir  = $this->Settings->get( 'photo_dir' ) ) == ""  ){
            echo "ディレクトリが設定されていません。";
            return false;
        }
        
        //インスタンスを生成
        $photo = new PhotoAlbum;
        //表示する写真のベースパス
        $photo->base_photo_dir = $basepath . "media/blogs/" . $photo_dir;
        $photo->disp_max       = $this->Settings->get( 'disp_max' );  
        
        //写真サイズ
        $width_max             = $this->Settings->get( 'width_max' );
        $height_max            = $this->Settings->get( 'height_max' );  

        //写真のディレクトリパス
        $photo_dir_url         = $baseurl . "media/blogs/" . $photo_dir;
        $pu                    = parse_url($photo_dir_url);
        $photo_dir_path        = $pu['path'];

        //サムネイルファイルのパス
        $image_php             = $baseurl . "plugins/photo_album_plugin/image.php";
        $i_pu                  = parse_url($image_php);
        $thumbnail_file_path   = $i_pu['path'];

        //データの取得
        if( ($file = $photo->getPhotoData()) == false ){
            echo "ファイルが取得できませんでした。";
            return false;
        }
        
        //更新日付が新しい順にソート    
        foreach ($file as $key => $val) {
            $sort_key[$key] = $val['time'];
        }
        array_multisort( $sort_key, SORT_DESC, $file );

        //出力
        echo "<div id='album'>";
        foreach($file as $val){
            echo "<div class='photoBlock'>";
            echo "<a href='{$photo_dir_path}{$val["name"]}' rel='lightbox[photo]'>";
            echo "<img src='{$thumbnail_file_path}?img={$photo_dir}{$val["name"]}&width={$width_max}&height={$height_max}' alt='{$val["name"]}' />";
            echo "</a>";
            echo "</div>\n";
        }
        echo "</div>";

        return true;
    }
}
//photo_album class
require_once("photo.class.php");

/* nolog */

画像出力

define( 'EVO_MAIN_INIT', true );
require_once("photo.class.php");
$photo = new PhotoAlbum;
//画像出力用
$photo->imageCreate("../../media/blogs/".$_REQUEST['img']);
 →ツイッターのフォローはこちら
スポンサード リンク
         

関連記事

↑ページ上部へ

アクセスカウンター

今日 : 7 昨日 : 56

ブログ内容

主にウェブ関係のことを書いてます。たまにブレイクダンスとか他のことも書いています。

プロフィール

MICK

MICKです。

1983年1月24日生まれ。ウェブの世界にいるのは、偶然のようで必然なのかも。

好きなこと :
 挑戦すること。物事に没頭すること。勉強すること。
嫌いなこと :
 自慢話を聞くこと。人の悪口を言うこと。

運営サイト

      

カテゴリ一覧

サイト広告

オススメの書籍とか

感想

紹介

色々

最近のコメント

最新記事

注目記事

人気記事

最近の人気記事

人気の記事

関連サイト

運営サイト

色々

最近のトラックバック