アーカイブ

  • [PHP]サムネイル

    同僚のハリネズミに依頼されてたような気がするのでアップしてみた。
    >>ハリネズミ
    CFシリーズに入れたょ。

    #*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
    #  saveImageFile
    #   [説明]
    #     イメージファイルのローカル保存、もしくはイメージ出力
    #   [パラメータ]
    #     $pImageUri[I] string
    #     ⇒イメージファイルのURI(http://形式でも、物理パスでも可)
    #     $pSaveFileName[I] string
    #     ⇒保存ファイルのファイルパス
    #       ※pSaveFileがtrueの場合に有効
    #     $pMaxWidth[I] integer
    #     ⇒保存時の最大の横幅( 0を指定するとそのままで、1以上の正数値を指定するとサムネイル可します。)
    #     $pDegrees[I] integer
    #     ⇒回転角度。確か時計回りで何度回転するかを指定
    #     $pSaveFile[I] boolean
    #     ⇒ファイルを保存するか否か、falseを指定するとそのままレスポンスとしてイメージ出力します。
    #   [返り値] mixed
    #     ⇒TRUE:     処理成功
    #       TRUE以外: 処理失敗
    #*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
    function saveImageFile(
        $pImageUri
      , $pSaveFileName
      , $pMaxWidth      = 0
      , $pDegrees       = 0
      , $pSaveFile      = TRUE
    ){
      $returnValue  = FALSE;
      $rsImage      = FALSE;
      $rsRotate     = FALSE;
      $rsNewImage   = FALSE;
      if( !extension_loaded('gd') && !extension_loaded('gd2') ){
        # 拡張モジュールのロードに失敗
        return $returnValue;
      }
      # サイズ情報の取得
      list( $imageWidth, $imageHeight, $imageType ) = @getimagesize( $pImageUri );
    
      #-----------------------------------------------------------
      # イメージファイルの読み込み
      switch( $imageType ){
        case IMAGETYPE_GIF:
          $rsImage = @imagecreatefromgif( $pImageUri );
          break;
        case IMAGETYPE_JPEG:
          $rsImage = @imagecreatefromjpeg( $pImageUri );
          break;
        case IMAGETYPE_PNG:
          $rsImage = @imagecreatefrompng( $pImageUri );
          break;
      }
      #-----------------------------------------------------------
      # イメージの回転
      if( $rsImage !== FALSE ){
        $rsRotate = @imagerotate( $rsImage, 360-$pDegrees, 0) ;
      }
      #-----------------------------------------------------------
      # リサイズイメージの作成
      if( $rsRotate !== FALSE ){
        # 回転後のイメージサイズの取得
        $imageWidth   = ImageSX($rsRotate);
        $imageHeight  = ImageSY($rsRotate);
        # リサイズ後のサイズを算出
        if( $pMaxWidth == 0 or $imageWidth <= $pMaxWidth ){
          # そのまま
          $newWidth   = $imageWidth;
          $newHeight  = $imageHeight;
        }else{
          # 最大サイズより大きい場合 => 縮小
          $newHeight  = intval(( (float)$pMaxWidth / (float)$imageWidth ) * (float)$imageHeight);
          $newWidth   = $pMaxWidth;
        }
        # 空画像を作成
        if( function_exists("imagecreatetruecolor") ){
          $rsNewImage = @imagecreatetruecolor( $newWidth, $newHeight );
        }else{
          $rsNewImage = @imagecreate( $newWidth, $newHeight );
        }
        # サンプリングしなおす
        if( function_exists("imagecopyresampled") ){
          $returnValue = @imagecopyresampled( $rsNewImage, $rsRotate, 0, 0, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight );
          if( $returnValue === FALSE ){
            $returnValue = @imagecopyresized( $rsNewImage, $rsRotate, 0, 0, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight );
          }
        }else{
          $returnValue = @imagecopyresized( $rsNewImage, $rsRotate, 0, 0, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight );
        }
      }
      if( $pSaveFile ){
        #-----------------------------------------------------------
        # イメージファイルの保存
        if( $returnValue !== FALSE && $rsNewImage !== FALSE ){
          switch( $imageType ){
            case IMAGETYPE_GIF:
              $returnValue = @imagegif( $rsNewImage, $pSaveFileName );
              break;
            case IMAGETYPE_JPEG:
              $returnValue = @imagejpeg( $rsNewImage, $pSaveFileName, 100 );
              break;
            case IMAGETYPE_PNG:
              $returnValue = @imagepng( $rsNewImage, $pSaveFileName );
              break;
          }
        }
      }else{
        #-----------------------------------------------------------
        # イメージファイルの表示
        if( $returnValue !== FALSE && $rsNewImage !== FALSE ){
          switch( $imageType ){
            case IMAGETYPE_GIF:
              header("Content-type: image/gif");
              $returnValue = @imagegif( $rsNewImage );
              break;
            case IMAGETYPE_JPEG:
              header("Content-type: image/jpeg");
              $returnValue = @imagejpeg( $rsNewImage, "", 100 );
              break;
            case IMAGETYPE_PNG:
              header("Content-type: image/png");
              $returnValue = @imagepng( $rsNewImage );
              break;
          }
        }
      }
      #-----------------------------------------------------------
      # リソースの解放
      @imagedestroy($rsImage);
      @imagedestroy($rsRotate);
      @imagedestroy($rsNewImage);
      return $returnValue;
    }
    
    2010年 2月 26日 | Filed under PHP
    タグ:
  • [PHP]file_get_contents で UserAgent を指定

    PHPのfile_get_contents()関数をそのまま使用すると、
    『PHP/x.x.x』という素直なユーザエージェントが相手に通知されます。

    それが気になる時もあって良いじゃないですか。

    ということで、ユーザエージェントを変更できるようにしてみた。
    (ついでにリファラーも。。。)
    stream_context_create()がポイントになるのだけど、考えてみたらPOST版もさっくり出来そうな気が・・・。
    それはさておき、今回はGET版でのテンプレートです。

    function _file_get_contents(
        $url
      , $referer    = ""
      , $useragent  = "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7"
    ){
      # User-Agentを指定
      $header = "User-Agent: ".$useragent."\r\n";
      # Refererを指定
      if( strlen($referer) > 0 ){
        $header .= "Referer: ".$referer."\r\n";
      }
      $options = array(
                  "http"=> array(
                          "method" => "GET"
                        , "header" => $header
                      )
                  )
                  ;
      return @file_get_contents( $url, FALSE, stream_context_create($options) );
    }
    

    使い方はこんな感じ。

    echo _file_get_contents(
                "http://www.google.com/"
              , "http://jp.msn.com/"
              , "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
            );
    

    ちなみに、POSTでのcontextの作成例はこんな感じ。

      $context = stream_context_create(array(
        'http' => array(
          'method'  => 'POST',
          'header'  => sprintf("Authorization: Basic %s\r\n", base64_encode($username.':'.$password)).
                       "Content-type: application/x-www-form-urlencoded\r\n",
          'timeout' => 5,
        ),
      ));
    

    当たり前といえばそうだけど、basic認証でも行けちゃうんですね♪
    すばらしい♪

    2010年 2月 26日 | Filed under PHP
    タグ:
Archive for 2010年 2月 26日