2015-08-22 54 views
1

我正在使用imagecopy將PNG圖像裁剪爲用戶規格。如何在PHP中使用imagecopy時使任何「額外空間」爲白色

目前,如果作物面積大於圖像,任何「額外空間」都會變黑,但我希望它是白色的。

已經搜索了一堆,我發現你可以使用imagefill或imagefilledrectangle使背景變成白色,但是如果這是在imagecopy之前完成的,那麼它不起作用,如果它在imagecopy之後完成,它也會使圖像中的任何黑色部分都是白色的。

我的代碼目前看起來像這一點,並從原始圖像的黑色部分受到影響而變成了白色,以及額外的空間:

// Input and output files 
$infile = "[Image]"; 
$outfile = "[Output path for image]" 

// Make the image 
$orig =imagecreatefromjpeg($infile); 
$width = imagesx($orig); 
$height = imagesy($orig); 
$new = imagecreatetruecolor($width, $height); 

// Crop the image 
imagecopy($new, $orig, 0, 0, -100, 100, $width, $height); 

// Try and make the extra space white 
$white = imagecolorallocate($new, 255,255,255); 
imagefill($new, 0, 0, $white); 

// Save the file 
imagepng($new, $outfile); 

我怎樣才能讓多餘的空間白色,而不會影響原來的形象呢?我無法控制用戶可能上傳的圖片,因此我無法選擇透明顏色,因爲該顏色可能是其原始圖片的一部分。

編輯:當用戶在原始圖像尺寸之外選擇剪裁尺寸時,會出現此方案,這是我確實希望成爲有效選項的東西。作物是強制一個正方形的圖像,但如果用戶上傳,例如,一個橫向矩形,並希望在最終作物中的所有圖像,那麼作物將在圖像的頂部和底部之外(這是我希望它是白色而不是黑色)

回答

1

發生這種情況是因爲您向imagecopy()(即,作物座標超出源圖像邊界)提供了「無效」值。 GD只是用黑色像素填充出界區域。如果它使用透明(或任何顏色)像素,這將是可愛的,但不幸的是,這不是一個選項。

我不完全理解(源似乎並不符合您的既定目標),你正在做什麼,但一個可能的解決方案包括限制作物圖像的邊界:

$src = imagecreatefromjpeg('JPEG FILE'); // 100x100 image in my test. 
$src_w = imagesx($src); 
$src_h = imagesy($src); 

$user_crop = [ 
    'x' => -50, 
    'y' => -50, 
    'width' => 150, 
    'height' => 150 
]; 

if ($user_crop['x'] < 0) { 
    $user_crop['x'] = 0; 
} 
if ($user_crop['y'] < 0) { 
    $user_crop['y'] = 0; 
} 
if ($user_crop['x'] + $user_crop['width'] > $src_w) { 
    $user_crop['width'] = $src_w - $user_crop['x']; 
} 
if ($user_crop['y'] + $user_crop['height'] > $src_h) { 
    $user_crop['height'] = $src_h - $user_crop['y']; 
} 

$dest = imagecreatetruecolor($src_w, $src_h); 
imagefill($dest, 0, 0, 0x00ffffff); // opaque white. 
imagecopy(
    $dest, 
    $src, 
    $user_crop['x'], 
    $user_crop['y'], 
    $user_crop['x'], 
    $user_crop['y'], 
    $user_crop['width'], 
    $user_crop['height'] 
); 

header('Content-type: image/png;'); 
imagepng($dest); 
imagedestroy($src); 
imagedestroy($dest); 
exit; 

請注意,我已經在此代碼中對裁剪圖像的位置做了一些假設。

+0

示例代碼被簡化了,但基本上用戶可以縮小和裁剪圖像邊界以外的圖像,我確實希望這是一個有效的選項。作物是強制正方形,但如果用戶的圖像是橫向矩形,並且他們希望所有原始圖像都位於最終輸出中,則裁切尺寸將位於頂部和底部原始圖像之外。希望是有道理的! –

+0

好的,我認爲這個解釋填補了我理解的空白。我會看看我是否可以修改上述內容。 – timclutton