0

Image::Magick perl モジュールを使用して Web フォームから既存の画像をトリミングする Perl スクリプトがあります (JCrop を使用して幅、高さ、x、y をフィードします)。トリミングされた画像はレスポンシブ デザイン環境で使用されるため、Web サイトのフロント エンドで使用する複数のサイズの画像を作成しています。サイズは (以下のコードに示すように) 配列に組み込まれ、1 つずつ処理されて各画像サイズが作成されます。

以下のコードからわかるように、最終的には画像を 3 回開いて 3 回書き込む必要があります。

私は当初、Image::Magick を使用してファイルを 1 回開き、「クロップ、サイズ変更、クロップ」プロセスを実行してから、画像を 1 回書き込もうとしましたが、結果は恐ろしいものでした。どの座標も適切に変換されず、その結果、値が完全に読み取られたにもかかわらず、画像はユーザーが Web フォームで要求したサイズにさえ近づきませんでした。

それで皆さんへの私の質問は、(開いたイメージを複数回操作して) 単一の「オープン」を実行し、Image::Magick perl モジュールを使用して単一の「書き込み」を実行できた人がいるかどうかです。もしそうなら、私が以下に投稿したコードの長い行になるサンプルを提供していただけますか? できる限りのお手伝いをさせていただきます。私のコードのスニペットを以下に示します。過度のコメントで申し訳ありません。できるだけ簡単にフォローできるようにしたかったのです:)

#!/usr/bin/perl

use Image::Magick;
use CGI qw(:cgi-lib);

&ReadParse(*input);

##############################
# Build array of sizes needed
##############################

my @sizes = ("1280","960","640","480","320","160");

foreach $size (@sizes) {
    $resized = "/path/to/size/folders/$size\/$input{image_ID}\.png";

    $image = Image::Magick->new;
    $x = $image->Read("/path/to/fullsize/image");

    #########################
    # Run the requested crop
    #########################

    $x = $image->Crop(width=>$input{w},height=>$input{h},x=>$input{x},y=>$input{y});

    ########################
    # Write cropped version
    ########################

    $x = $image->Write("$resized");

    ###########################
    # Open the cropped version
    ###########################

    $image = Image::Magick->new;
    $x = $image->Read("$resized");

    ###############################################
    # Size the image down to +2 pixels all around
    # to handle border opacity when pixel rounding
    ###############################################

    $temp_width = $size + 2;
    $temp_height = ($temp_width * $input{h}) / $input{w};

    ###########################
    # Resize the cropped image
    ###########################

    $x = $image->Resize(width=>$temp_width, height=>$temp_height);

    ################################
    # Write the newly resized image
    ################################

    $x = $image->Write("$resized");

    ########################################
    # Calculate final dimensions and coords
    ########################################

    $final_height = ($size * $temp_height) / $temp_width;
    $final_x = 1;
    $final_y = 1;

    ###############################
    # Open the newly resized image
    ###############################

    $image = Image::Magick->new;
    $x = $image->Read("$resized");

    #######################################
    # Final crop the image for clean edges
    #######################################

    $x = $image->Crop(width=>$size,height=>$final_height,x=>$final_x,y=>$final_y);

    ########################################
    # Write the final cropped image for use
    ########################################

    $x = $image->Write("$resized");
}
4

2 に答える 2

0

これには非常に遅れていますが、誰かに役立つ場合、これは私にとってはうまくいきます:

my $imageName = 'picture';
my $file = "tmp/original.jpg";

# Create the image object
my $imageFile = Image::Resize->new($file);

# Resize and save one...
my $image = $imageFile->resize(800, 450);
open(FH, ">$siteroot/user_pics/$imageName\_800x450.jpg");
print FH $image->jpeg();
close(FH);

# Resize and save another...
my $thumb = $imageFile->resize(224, 126);
open(FH, ">$siteroot/user_pics/$imageName\_224x126.jpg");
print FH $thumb->jpeg();
close(FH);

# etc...

unlink ("tmp/original.jpg");
于 2017-04-27T22:34:44.230 に答える