1

これを実行しようとしているスクリプトがいくつかあることに気付きましたが、私の状況に完全に適合するものはありません。

見つけたいくつかのスクリプトをかき集めて、正しい解決策を見つけようとしました。

しかし、私は今2つの問題に遭遇しました。

  1. 画像が中央にありません。
  2. 三角形の辺の長さは等しくありません。

デモはhttp://owenmelbourne.com/triangle.phpにあります。

コードは

$src = imagecreatefromjpeg ('http://uat.eruptedevents.secureping.co.uk/media/images/upload/1200/154.jpg');
// Get image width/height

$srcWidth   = imagesx ($src);
$srcHeight  = imagesy ($src);

// Get centre position

$centreX    = floor ($srcWidth / 2);
$centreY    = floor ($srcHeight / 2);

// Set new image size and start x/y

$destWidth  = $srcWidth;
$destHeight = $srcHeight;

$destSX     = 0;
$destSY     = $centreY;

// Create the image
$square = 500;

if( $srcWidth >= $srcHeight ){
    $square = $srcHeight;
}
else {
    $square = $srcWidth;
}
$shift = array ("left" => 0, "top" => 0);

$shift["left"] = ( $srcWidth / 4 ) * -1;
$shift["top"] = ( $srcHeight / 4 ) * -1;

$dest   = imagecreatetruecolor ($square, $square);

// Copy from source
imagecopy ($dest, $src, $shift["left"], $shift["top"], 0, 0, $destWidth, $destHeight);

// OK... we now have the correctly sized rectangle copied over from the source image
// Lets cut it down and turn it into the triangle we want by removing the other triangles
// We remove the area by defining another colour as transparent and creating shapes with that colour

$colRed  = imagecolorallocatealpha ($dest, 255, 0, 0, 0);
$blue  = imagecolorallocatealpha ($dest, 0, 0, 244, 0);
imagecolortransparent ($dest, $colRed);

$sidelength = $square;

imagefilledpolygon ($dest, array (
                    0, 0,
                    $square/2, 0,
                    0, $square
                    ), 3, $colRed);
imagefilledpolygon ($dest, array (
                    $square, 0,
                    $square, $square,
                    $square/2, 0
                    ), 3, $colRed);

$dest2   = imagecreatetruecolor ($square, $square);

// Output new image

header ('Content-Type: image/png');
imagepng ($dest);

// Clean up

imagedestroy ($thumbNail);
imagedestroy ($dest);

真ん中から完全な三角形の切り抜きを取り、それを画像として返すにはどうすればよいですか?

どうもありがとう

4

2 に答える 2

2

長方形の正三角形

右、長方形内に最大サイズの正三角形が必要であると仮定すると、平らな辺が水平軸に平行になります。長方形の縦横比に応じて 2 つのシナリオがあります。


横長の長方形 (幅 > 高さ)

長方形の正三角形 - 横長

この場合、長方形の高さが制限要因になります。

タスクは、三角形の辺の長さを決定し、それを使用して、長方形の中点から半分の長さを取ることにより、三角形の 2 つの底点の位置を見つけることです。

三角形の長さeをダイアグラムでマークされているとおりに呼び出し (gおよびもf)、長方形の高さを としてマークするとa、三角法を簡単に説明すると、次のようになります。

sin 60 = opp / hyp = a / e = sqrt(3) / 2

それで

e = 2a / sqrt(3)

図のように水平な辺と呼ぶことができますbが、中点は明らかにb / 2にあるため、三角形の底辺の点は にあり[ (b / 2) ± (e / 2) , 0 ]ます。

トリミングを実行するには、次の手順を実行します。

  1. ソースと同じサイズの新しい画像を作成する
  2. 目的地全体を透明に塗りつぶす
  3. 三角形の 2 つのベース ポイント間の高さいっぱいの長方形をコピー元からコピー先の同じ場所にコピーします。
  4. 三角形の 2 つのベース ポイントから、その上に平行な長方形の上部まで、長方形の上部の中点まで、両側を透明で塗りつぶします。

縦長の長方形 (幅 < 高さ)

長方形の正三角形 - 縦長

この場合、幅が制限要因になります。

したがって、三角形の一辺の長さは長方形の幅であり、それが知られています。計算する必要があるのは、三角形の高さです。

図に示されているように高さを呼び出し、前のようHに幅を呼び出すとb、単純な三角法は次のように述べます。

sin 60 = opp / hyp = H / b = sqrt(3) / 2

それで

H = b x sqrt(3) / 2

図のように垂直な辺と呼ぶことができa、中点は にa / 2あるので、三角形の底辺の点は[ 0 , (a / 2) + (H / 2) ][ b , (a / 2) + (H / 2) ]にあり、三角形の頂点Eは にあり[ (b / 2) , (a / 2) - (H / 2) ]ます。

トリミングを実行するには、次の手順を実行します (最初は前と同じ 2 つの手順)。

  1. ソースと同じサイズの新しい画像を作成する
  2. 目的地全体を透明に塗りつぶす
  3. 三角形の底辺と先端の間の全幅のソースからコピー先Eの同じ場所に長方形をコピーします
  4. 三角形の 2 つの基点から、三角形の先端から、問題の三角形の基点と同じ側とE同じ高さのエッジ上の点まで、三角形の両側を透明で塗りつぶします。E

注意。正方形がある場合は、どちらの計算でも機能するはずですが、ランドスケープの計算の方が簡単に思えるので、それを使用します。


コード

あなた自身のものから適応したので、私の通常のコーディングスタイルではありませんが、うまくいきます。透明性は GD では少し面倒なので、しばらく時間がかかりました。

オリジナル

ランタンを持ったジュニアゴーグ

切り抜き (以下のコードで作成)

ジュニア ゴーグ ランタン - 三角形のクロップド

<?php

// Acquire image

$src = imagecreatefromjpeg ('http://i.stack.imgur.com/YlnCJ.jpg');

// Get image width/height

$srcWidth   = imagesx ($src);
$srcHeight  = imagesy ($src);

// Get centre position

$centreX    = floor ($srcWidth / 2);
$centreY    = floor ($srcHeight / 2);

// Calculate triangle length (base) and points

if ( $srcWidth >= $srcHeight ) {
    $base = (2 * $srcHeight) / sqrt(3);
    $points = array( 'a' => array( 'x' => $centreX - ( $base / 2 ),
                                   'y' => $srcHeight ),
                     'b' => array( 'x' => $centreX + ( $base / 2 ),
                                   'y' => $srcHeight ),
                     'c' => array( 'x' => $centreX,
                                   'y' => 0 ) );
} else {
    $base = $srcWidth;
    $height = $base * sqrt(3) / 2;
    $points = array( 'a' => array( 'x' => 0,
                                   'y' => $centreY + ( $height / 2 ) ),
                     'b' => array( 'x' => $srcWidth,
                                   'y' => $centreY + ( $height / 2 ) ),
                     'c' => array( 'x' => $centreX,
                                   'y' => $centreY - ( $height / 2 ) ) ); 
}

// Create destination, same size as source

$dest = imagecreatetruecolor ($srcWidth, $srcHeight);

// Setup full alpha handling for pngs (8-bit)
imagealphablending ($dest, false);
imagesavealpha ($dest, true);

// Define a transparent colour

$colTrans  = imagecolorallocatealpha ($dest, 255, 255, 255, 127);

// If old png transparency was used, setting the transparency colour
// would be needed, with 8-bit it is not
// imagecolortransparent ($dest, $colTrans);

// Make the image transparent

imagefill ($dest, 0, 0, $colTrans);

// Copy from source just the rectangle flush with the triangle

imagecopy ($dest, $src, // Images
           $points['a']['x'], $points['c']['y'], // Destination x,y
           $points['a']['x'], $points['c']['y'], // Source x,y
           $points['b']['x'] - $points['a']['x'], // Width
           $points['a']['y'] - $points['c']['y']); // Height

// Fill out the triangles within that area not wanted with transparent

// Left side

imagefilledpolygon ($dest, array( $points['a']['x'], $points['a']['y'],
                                  $points['c']['x'], $points['c']['y'],
                                  $points['a']['x'], $points['c']['y'] ),
                    3, $colTrans);

// Right side

imagefilledpolygon ($dest, array( $points['b']['x'], $points['b']['y'],
                                  $points['c']['x'], $points['c']['y'],
                                  $points['b']['x'], $points['c']['y'] ),
                    3, $colTrans);

// Output new image

header ('Content-Type: image/png');

imagepng ($dest);

// Clean up

imagedestroy ($src);
imagedestroy ($dest);
于 2013-06-11T19:31:47.477 に答える