1

verotのclass.uploadでboostrapファイルのアップロードを使用しています。私のコードはすべて正常に動作しますが、スクリプトが画像をトリミングする方法を決定するチェックボックスを追加する機能を追加したいと考えています。

$handle->image_ratio_crop = true; // basically zooms in on the middle (default)
$handle->image_ratio_fill = true; // preserves ratio and adds white bars where needed

ユーザーが画像の横にある image_ratio_fill をチェックすると、スクリプトのデフォルトの代わりにこれが使用されるようになります。現在、このページには 4 つの画像をアップロードできます。次のスクリプトは、各ファイルを反復処理し、必要なトリミング .etc を追加します。

PHP:

function upImageSpec($table, $m_x, $m_y, $t_x, $t_y)
{
    $id = $_GET['id'];
    $img_db_name = str_replace('s', '', $table); // this will replace the s with nothing so that it is user_image_1, project_image_1 for the db insertion
    // unchanging variables
    $ext = 'jpg';
    $upload_path = FRONTEND_IMAGE_UPLOAD_PATH . slash_item($table) . slash_item($id); // will not work with /images/
    // end unchanging variables
    $files = array();
    foreach ($_FILES['userfile'] as $k => $l) {
        foreach ($l as $i => $v) {
            if (!array_key_exists($i, $files))
                $files[$i] = array();
            $files[$i][$k] = $v;
        }
    }
    $counter = 1;
    foreach ($files as $file) {
        // foreach variables
        $main_name = 'm_' . $id;
        $thumb_name = 't_' . $id;
        $count = $counter++;
        // end foreach variables
        $handle = new upload($file);
        if ($handle->uploaded) {
            // save uploaded image $m_x, $m_y
            $mi = sprintf("%s_%d", $main_name, $count);
            $full_src = REL_FRONTEND_IMAGE_UPLOAD_PATH . slash_item($table) . slash_item($id) . $mi . '.' . $ext;
            $handle->file_new_name_body = $mi;
            $handle->image_convert = $ext;
            $handle->allowed = array(
                'image/*'
            );
            $handle->file_max_size = MAX_IMAGE_FILE_SIZE;
            $handle->jpeg_quality = 95;
            $handle->image_resize = true;
            //$handle->image_ratio_crop = true;
            $handle->image_ratio_fill = true;
            $handle->image_x = $m_x;
            $handle->image_y = $m_y;
            $handle->file_overwrite = true;
            $handle->auto_create_dir = true;
            $handle->process($upload_path);
            if ($handle->processed) {
                Nemesis::update($table, "last_modified = NOW(), last_modified_by = '{$_SESSION[user_id]}', {$img_db_name}_image_{$count} = '{$full_src}'", "id = '{$id}'");
            } else {
                $msg = new Messages();
                $msg->add('e', $handle->error);
            }
            // thumbnail part, same as above, just w/ diff dimensions
        }
        unset($handle);
    }
}

HTML:

    <?php if ($totalRows_projects > 0) { ?>
    <?php $msg = new Messages(); echo $msg->display(); ?>
    <h2>Project Images<?php if (!empty($row_projects['project_name'])) { echo ': ' . $row_projects['project_name']; }?></h2>
    <form action="framework/helpers/image_handler.php?type=upload&id=<?php echo $_GET['id']; ?>" method="post" enctype="multipart/form-data">
       <?php $counter = 1; while ($row = $resultImages->fetch_assoc()) { $count = $counter++; ?>
       <div class="fileupload fileupload-new" data-provides="fileupload">
          <input type="hidden">
          <div class="fileupload-new thumbnail" style="width: 104px; height: 76px;"><span id="img<?php echo $count; ?>"><img src="<?php getThumb($row_projects["project_image_$count"]); ?>"></span></div>
          <div class="fileupload-preview fileupload-exists thumbnail" style="width: 104px; height: 76px; line-height: 50px; "></div>
          <span class="btn btn-file"><span class="fileupload-new">Select image</span><span class="fileupload-exists">Change</span><input type="file" name="userfile[]" id="file<?php echo $count; ?>" class="search" multiple></span>
          <a href="#" class="btn fileupload-exists" data-dismiss="fileupload">Remove</a>
          <?php if (is_file(ROOT . $row_projects["project_image_$count"])) { ?><a href="javascript:void(0);" onclick="$.get('framework/helpers/image_remove.php',{ cmd: 'deleteImage', image: '<?php echo $row_projects["project_image_$count"]; ?>' } ,function(data){ $('#img<?php echo $count; ?>').html(data); });" class="fileupload-controls btn btn-danger" title="Deletion is permanent!">Remove Existing</a><?php } ?>
          <select name="cropfactor" class="select-ms">
             <option value="1">Ratio Crop</option>
             <option value="2">Ratio Fill</option>
          </select>
       </div>
       <?php } ?>
       <br><input name="submit" type="submit" id="submit" value="Add Project Image" class="btn btn-success"><a id="back" href="projects.php" class="btn btn-space" title="No changes will be made">Skip to Projects</a><?php if (!empty($row_projects['youtube_link'])) { ?><a id="yt_image" href="framework/helpers/image_handler.php?type=youtube&id=<?php echo $id; ?>&link=<?php echo $row_projects['youtube_link']; ?>" class="btn btn-space" title="Add Youtube still as a main image">Get YouTube Thumb</a><?php } ?>
       <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $MAX_IMAGE_FILE_SIZE ?>">
    </form>
    <?php } ?>

投稿時に、上のコードが送信され、image_handler.php を介して上記の関数によって処理されます

コードスニペット:

case 'upload':
    if (checkIDExists()) {
        upImageSpec('projects', 458, 332, 104, 76);
        redirect('', true);
    } else {
        $msg = new Messages();
        $msg->add('e', QUERY_ID_ERROR);
        redirect('', true);
    }
    break;

cropfactor比率塗りつぶしに変更された場合にデフォルト (比率クロップ) がオフに切り替えられ、使用されるように、フィールドをどのように使用するのでしょうかimage_ratio_fill。ページ上の他の画像はデフォルトのままにしておくことをお勧めします。機能しなかった単純な if else ステートメントを試しました。

4

2 に答える 2

1

これを試して:

フォーム フィールドの CropFactor は、

<select name="cropfactor[]" class="select-ms">
..
</select>

そしてあなたの機能で:

//after $id = $_GET['id']; add following
$cropfactor = $_POST['cropfactor'];

そして、ファイルごとに $cropfactor の各値を調べます

foreach ($files as $file) {
    // ... all other codes

    if ($handle->uploaded) {
        //...everything else        

        if($cropfactor[$counter] == 1) {
           $handle->image_ratio_crop = true;
        } else {
           $handle->image_ratio_fill = true;
        }

    }    
}

それが役に立てば幸い。

注: コードはテストされていません。

于 2013-07-23T02:50:54.377 に答える
1

ほとんどのコードは既に配置されています。最初Selectに、指定された画像に関連付けられるように名前を変更します (Select画像ごとに 1 つ、 ごとに 1 つの名前Select)。これは、使用しているのと同じ方法論に頼ることで簡単に行うことができます。つまり、次のとおりです。

<select name="cropfactor<?php echo $count; ?>" class="select-ms">
    <option value="1">Ratio Crop</option>
    <option value="2">Ratio Fill</option>
</select>

選択した値は で送信され、Formを介して取得されます$_POST[$cropName]。は指定さ$cropNameれた の名前ですSelect

PHP コードは次のようになります。

$cropName = "cropfactor" . $count;
$handle->image_ratio_crop = ($_POST[$cropName] == "1");
$handle->image_ratio_fill = ($_POST[$cropName] == "2");
于 2013-07-23T15:12:47.860 に答える