0

ユーザーがコンテナー内の画像のサイズを変更できるようにしてから、コンテナーのサイズの結果の画像を作成する必要があるという問題が発生していますが、画像はユーザーの選択に従ってスケーリングおよび調整されています。

たとえば、コンテナが 400 x 200 で、ユーザーが 600 x 100 のロゴを配置できるようにしたい場合、ロゴが収まるように縮小して上部と下部にスペースを残すことができます。上下に適切なギャップがある 400x200 の画像として保存できるようにする必要があります。

私が見つけたのは、画像コンテンツ(この例のロゴ)がコンテナの上部と右の両方を超えている場合はすべて問題ないか、どちらかを超えていない場合は問題ありませんが、1つを超えていない場合もう一方は黒く塗りつぶされます-またはそのようなもの-以下の例を参照してください...

以下は結果の例です。これは私が使用しているコードです...

$cropped =  wp_imagecreatetruecolor( $frame_w, $frame_h);
    $backgroundColor = imagecolorallocatealpha($cropped, 0, 0, 0, 127);
    //imageantialias( $cropped, true );
    //if $img_y or $img_x are negative we need to apply the value to $img_x and $img_y
    //if $img_y or $img_x are positive we need to apply the value to $dest_x and $dest_y
    $dest_x = strstr($img_x,'-') ? 0 : abs($img_x);//if neg is true = 0 else offset inside
    $dest_y = strstr($img_y,'-') ? 0 : abs($img_y);
    $img_x = strstr($img_x,'-') ? abs($img_x) : 0;//if neg is true offset outside else 0
    $img_y = strstr($img_y,'-') ? abs($img_y) : 0;
    $img_w = $img_w > $frame_w ? $frame_w : $img_w;
    $img_h = $img_h > $frame_h ? $frame_h : $img_h;
    imagecopy( $cropped, $resized, $dest_x, $dest_y, $img_x, $img_y, $img_w, $img_h);
    //imagecopymerge( $cropped, $resized, $dest_x, $dest_y, $img_x, $img_y, $img_w, $img_h,100);
    //imagecopyresampled( $cropped, $resized, $dest_x, $dest_y, $img_x, $img_y, $frame_w, $frame_h, $img_w, $img_h );
    imagefill($cropped, 0, 0, $backgroundColor);//putting this after the copy makes any black borders transparent again unless $resized does not extend beyond both dimensions

画像が上または右からはみ出していない (罰金) 画像が上または右からはみ出していない (罰金)

画像は下からはみ出していますが、正しくはありません (問題ありません) 画像は下からはみ出していますが、正しくはありません (問題ありません)

画像は両方を超えています (細かい) 画像は両方を超えています (細かい)

画像は右からはみ出していますが、下からはみ出していません (問題ありません) 画像は右からはみ出していますが、下からはみ出していません (問題ありません)

イメージはどちらにも及ばない (細かい) イメージはどちらにも及ばない (細かい)

私は文字通りこれを修正しようとして髪を引き裂いており、私が考えることができるimagesavealpha、imagecopymerged、imagecolorallocatealpha、imagealphablendingなどの可能な限りの組み合わせを試しましたが、これを修正するものは何もないようです...

これは GD のバグ/制限ですか? それとも、誰かが私の救助に来ることができますか!

4

3 に答える 3

0

基本的に「ImageMagickを使用する」ので、これが実際の答えかどうかはわかりませんが、とにかくImageMagickがオプションである人にとっては、以下のコードは、私が上にしようとしていたのと同じことを達成するのに役立つかもしれません...基本的にImageMagick GD よりもはるかに優れているように見えます。回転した画像の周りに境界線がなく、透明度に問題がなく、不要な黒い塗りつぶしがなく、拡大する場合のサイズ変更がより明確になります...

$img_x = -50; //left offset of the image within the frame
$img_y = 50; //top offset of the image within the frame
$img_w = 400; //width of the image to be put in the frame
$img_h = 200; // height of the image to be put in the frame
$angle = 45; //rotation to be applied to the image before it is put into the frame
$frame_w = 300; //width of the frame the image is going into
$frame_h = 300; //height of the frame the image is going into
$img_path = 'path/to/image/file.jpg';
$image = new Imagick( $img_path );
$size = $image->getImageGeometry();
$orig_w = $size['width']; $orig_h = $size['height'];
$image->scaleImage( $img_w, $img_h );
//rotate if necessary
if($angle)
    {
    $image->rotateImage( new ImagickPixel('none'), $angle );
    $size = $image->getImageGeometry();
    $img_w = $size['width']; $img_h = $size['height'];
    }
//composite into frame
//in imagemagick we create an image that is the size of the frame and make it transparent
$frame = new Imagick();
$frame->newImage($frame_w, $frame_h, new ImagickPixel("none"));
//then we composite the image itself into this with the respective offset values
$frame->compositeImage( $image, Imagick::COMPOSITE_DEFAULT, $img_x, $img_y );
//save it
$destfilename = "{$dir}/{$name}-{$img_suffix}.{$ext}";
$frame->writeImage($destfilename);
$frame->clear();
$frame->destroy();
$image->clear();
$image->destroy();

上記のコードは生成します 上記のコードはこれを生成します...やった!

于 2013-02-07T15:14:40.587 に答える
0

これがお役に立てるかどうかわかりませんが、今日はこれで問題が発生しました。ボックスは拡大しますが、その領域は黒でした。これが私のコードです(これで修正されます):

<?php
function createImage($text)
{
    // Adds an extra space to fill underline
    $text = " $text";
    // Adds one line at the end
    $text .= "\n";
    // Wrap the text to fit the image
    $text = wordwrap($text, 40, "\n");
    // Count new lines
    $newlines = substr_count($text, "\n");
    // Count how long to expand
    if($newlines == 0)
    {
        $height = 30;
    }
    else
    {
        $height = 30*$newlines-$newlines*5;
    }

    putenv('GDFONTPATH=' . realpath('.'));
    header('Content-Type: image/png');
    // Adding underline
    $e = explode('<', $text);
    for($i=0;$i<count($e);$i++)
    {
        $e[$i] = implode('&#x0332;', str_split($e[$i]));
    }
    // Creating image
    $text = implode(' ', $e);
    $im = imagecreatetruecolor(315, $height);
    $white = imagecolorallocate($im, 255, 255, 255);
    $grey = imagecolorallocate($im, 128, 128, 128);
    $black = imagecolorallocate($im, 0, 0, 0);
    $purple = imagecolorallocate($im, 97, 26, 139);
    imagefilledrectangle($im, 0, 0, 399, $height, $white);
    $font = 'arialbd.ttf';

    imagettftext($im, 11, 0, 10, 20, $purple, $font, $text);
    imagepng($im);
    imagedestroy($im);
}

createImage("asbdasddsa");
?>
于 2013-02-07T03:59:10.193 に答える
0

これは、他の形式のPNGチェックでのみ発生すると思います

于 2013-02-07T12:23:01.713 に答える