LoginSignup
3
5

More than 5 years have passed since last update.

Josegonzalez/Upload.Upload 使い方

Last updated at Posted at 2018-05-24

あんまりよくねーな。このプラグイン。
画像向きもうまく変更されなかったり。。。

と思ったが、laravelでも同様のバグがおきた。
ということで強調して解決方法書いておく。

imagickで画像を読み込み。
向きを直して上書き。


//            ここで画像の向きを変更する
$imagick = new \Imagick();
$imagick->readImage($_FILES['img']['tmp_name']);
$imagick->autoOrient();
$imagick->writeImage($_FILES['img']['tmp_name']);

例えば laravel なら


        if($request->all()) {

            $imagick = new \Imagick();
            $imagick->readImage($_FILES['image']['tmp_name']);
            $imagick->autoOrient();
            $imagick->writeImage($_FILES['image']['tmp_name']);


こんな感じね。

2019/01/22
imagick を使って、
画像向きを変更。

cakephp3で画像をアップロードしたい。
昔はmediapluginがあったが、時代が変わったようなので新しい方法を。

Josegonzalez/Upload.Upload を使おう。

Josegonzalez/Upload.Upload は composer でインストール済みとする。

・uploadsテーブルの作成

id , social_id , img , dir , created

・uploadsTableモデル


<?php

namespace App\Model\Table;
use Cake\Validation\Validator;
use Cake\ORM\RulesChecker;

use Cake\ORM\Query;
use Search\Manager;//Searchするときに必須

use Cake\ORM\TableRegistry;
use Cake\I18n\Time;

use Cake\Datasource\ConnectionManager;
use Google\Cloud\Storage\StorageClient;

class UploadsTable extends AppTable
{

    var $thumb = [
        'thumbnail' => [
            '600x381'
        ],
        'crop' => [
            '73x73'
        ]
    ];


    public function initialize(array $config)
    {


        $this->addBehavior('Josegonzalez/Upload.Upload', [
            'img' => [
                'nameCallback' => function ($data, $settings) {
                    $ext = mb_strtolower(pathinfo($data['name'], PATHINFO_EXTENSION));
                    return md5(uniqid(rand(),1)).".".$ext;
                },
                'transformer' =>  function ($table, $entity, $data, $field, $settings) {


//            ここで画像の向きを変更する
                    $imagick = new \Imagick();
                    $imagick->readImage($_FILES['img']['tmp_name']);
                    $imagick->autoOrient();
                    $imagick->writeImage($_FILES['img']['tmp_name']);


                    $res = [
                        $data['tmp_name'] => $data['name']
                    ];



                    foreach ($this->thumb as $key => $v) {

                        foreach ($v as $s) {


                            $extension = mb_strtolower(pathinfo($data['name'], PATHINFO_EXTENSION));

                            // サムネイルを保存
                            $tmp = tempnam(sys_get_temp_dir(), 'upload') . '.' . $extension;

                            $img_size = explode("x",$s);

                            $size = new \Imagine\Image\Box($img_size[0],$img_size[1]);


                            if($key == 'thumbnail'){
                                $mode = \Imagine\Image\ImageInterface::THUMBNAIL_INSET;
                            } elseif($key == 'crop') {
                                $mode = \Imagine\Image\ImageInterface::THUMBNAIL_OUTBOUND;
                            }


                            $imagine = new \Imagine\Gd\Imagine();

                            // Save that modified file to our temp file
                            $imagine->open($data['tmp_name'])
                                ->thumbnail($size, $mode)
                                ->save($tmp);

                            $res[$tmp] = $key.'_'.$s.'_' . $data['name'];
                        }

                    }

                    return $res;

                },
            ],
        ]);

    }


    public function validationDefault(Validator $validator)
    {
        // バリデータにプロバイダーを追加
        $validator->setProvider('upload', 'Josegonzalez\Upload\Validation\DefaultValidation');

        $validator ->add('img', [
            'uploadedFile' => [
                'rule' => ['uploadedFile', ['types' => ['image/jpeg','image/png','image/gif']]],
                'last' => true,
                'message' => 'gif , jpeg , png のみアップロード可能です。'
            ]
        ])
            ->add('img', 'fileUnderPhpSizeLimit', [
                'rule' => 'isUnderPhpSizeLimit',
                'message' => 'ファイルサイズが大きすぎます。',
                'provider' => 'upload'
            ])
            ->add('img', 'fileUnderFormSizeLimit', [
                'rule' => 'isUnderFormSizeLimit',
                'message' => 'ファイルサイズが大きすぎます。',
                'provider' => 'upload'
            ]);


        return $validator;
    }

}





画像のアップロードフォームは以下を参考にしてね
https://qiita.com/ma7ma7pipipi/items/1a1081b0dd71365a3e7e

メモ

画像をジャストフィットリサイズ、クロップしたい場合は以下を指定


$mode = \Imagine\Image\ImageInterface::THUMBNAIL_OUTBOUND;

上記出いけると思うが、これを手作業にすれば


    function resizeToFit( $targetWidth, $targetHeight, $sourceFilename )
    {
        // Box is Imagine Box instance
        // Point is Imagine Point instance
        $imagine = new \Imagine\Gd\Imagine();


        $target = new \Imagine\Image\Box($targetWidth, $targetHeight );
        $originalImage = $imagine->open( $sourceFilename );
        $orgSize = $originalImage->getSize();



        if ($orgSize->getWidth() > $orgSize->getHeight()) {
            // Landscaped.. We need to crop image by horizontally
            $w = $orgSize->getWidth() * ( $target->getHeight() / $orgSize->getHeight() );
            $h = $target->getHeight();
            $cropBy = new \Imagine\Image\Point( ( max ( $w - $target->getWidth(), 0 ) ) / 2, 0);
        } else {
            // Portrait..
            $w = $target->getWidth(); // Use target box's width and crop vertically
            $h = $orgSize->getHeight() * ( $target->getWidth() / $orgSize->getWidth() );
            $cropBy = new \Imagine\Image\Point( 0, ( max( $h - $target->getHeight() , 0 ) ) / 2);
        }


        $tempBox = new \Imagine\Image\Box($w, $h);
        $img = $originalImage->thumbnail($tempBox, \Imagine\Image\ImageInterface::THUMBNAIL_OUTBOUND);
        // Here is the magic..
//        $res = $img->crop($cropBy, $target);


        $img->crop($cropBy, $target)
            ->save(WWW_ROOT."/files/hoge3.png");

//        pd($cropBy);

//        die;
//
//        $tempBox = Box($w, $h);
//        $img = $originalImage->thumbnail($tempBox, ImageInterface::THUMBNAIL_OUTBOUND);
//        // Here is the magic..
//        return $img->crop($cropBy, $target); // Return "ready to save" final image instance
    }



上記のようなメソッドになりますね。
ただ、処理結果はほぼ同じ。

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5