作者 主題: 關於PHP用GD縮圖左上角總會有1px的黑點  (閱讀 10164 次)

0 會員 與 1 訪客 正在閱讀本文。

liteC

  • 憂鬱的高中生
  • ***
  • 文章數: 158
    • 檢視個人資料
    • 軟體
關於PHP用GD縮圖左上角總會有1px的黑點

因為本人的眼力較差一直沒發現, 一發現後一直找問題, 但因為在windows本機測試程式都一切正常
但傳到linux主機上, 每次把上傳的圖檔等比例縮圖後都會產生那麼 1px 黑點在左上角, 真是非常奇怪

如果把 imagecreatetruecolor 改成 imagecrate 就不會有這麼問題, 但因為色盤的關係縮圖品質非常糟

一度懷疑是主機上GD函式庫的BUG所以我重裝了最新版的GD一樣會有這個問題,

用google搜尋中英文資料一下午了花了三四小時, 又反複測試一樣是windows主機正常, linux主機就發生這問題.. 不知版上前輩能否指點迷津


== Windows主機的GD Info == var_dump(gd_info());
array(12) { ["GD Version"]=>  string(27) "bundled (2.0.34 compatible)" ["FreeType Support"]=>  bool(true) ["FreeType Linkage"]=>  string(13) "with freetype" ["T1Lib Support"]=>  bool(true) ["GIF Read Support"]=>  bool(true) ["GIF Create Support"]=>  bool(true) ["JPG Support"]=>  bool(true) ["PNG Support"]=>  bool(true) ["WBMP Support"]=>  bool(true) ["XPM Support"]=>  bool(false) ["XBM Support"]=>  bool(true) ["JIS-mapped Japanese Font Support"]=>  bool(false) }

== Linux主機的GD Info == var_dump(gd_info());
array(12) { ["GD Version"]=>  string(27) "bundled (2.0.34 compatible)" ["FreeType Support"]=>  bool(true) ["FreeType Linkage"]=>  string(13) "with freetype" ["T1Lib Support"]=>  bool(false) ["GIF Read Support"]=>  bool(true) ["GIF Create Support"]=>  bool(true) ["JPG Support"]=>  bool(true) ["PNG Support"]=>  bool(true) ["WBMP Support"]=>  bool(true) ["XPM Support"]=>  bool(true) ["XBM Support"]=>  bool(true) ["JIS-mapped Japanese Font Support"]=>  bool(false) }
« 上次編輯: 2009-11-03 17:18 由 liteC »
非常謝謝學長們熱心回答我發問的問題
非常感寫 m(_ _)m

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #1 於: 2009-11-03 18:08 »
關於PHP用GD縮圖左上角總會有1px的黑點

因為本人的眼力較差一直沒發現, 一發現後一直找問題, 但因為在windows本機測試程式都一切正常
但傳到linux主機上, 每次把上傳的圖檔等比例縮圖後都會產生那麼 1px 黑點在左上角, 真是非常奇怪

如果把 imagecreatetruecolor 改成 imagecrate 就不會有這麼問題, 但因為色盤的關係縮圖品質非常糟

一度懷疑是主機上GD函式庫的BUG所以我重裝了最新版的GD一樣會有這個問題,

用google搜尋中英文資料一下午了花了三四小時, 又反複測試一樣是windows主機正常, linux主機就發生這問題.. 不知版上前輩能否指點迷津


== Windows主機的GD Info == var_dump(gd_info());
array(12) { ["GD Version"]=>  string(27) "bundled (2.0.34 compatible)" ["FreeType Support"]=>  bool(true) ["FreeType Linkage"]=>  string(13) "with freetype" ["T1Lib Support"]=>  bool(true) ["GIF Read Support"]=>  bool(true) ["GIF Create Support"]=>  bool(true) ["JPG Support"]=>  bool(true) ["PNG Support"]=>  bool(true) ["WBMP Support"]=>  bool(true) ["XPM Support"]=>  bool(false) ["XBM Support"]=>  bool(true) ["JIS-mapped Japanese Font Support"]=>  bool(false) }

== Linux主機的GD Info == var_dump(gd_info());
array(12) { ["GD Version"]=>  string(27) "bundled (2.0.34 compatible)" ["FreeType Support"]=>  bool(true) ["FreeType Linkage"]=>  string(13) "with freetype" ["T1Lib Support"]=>  bool(false) ["GIF Read Support"]=>  bool(true) ["GIF Create Support"]=>  bool(true) ["JPG Support"]=>  bool(true) ["PNG Support"]=>  bool(true) ["WBMP Support"]=>  bool(true) ["XPM Support"]=>  bool(true) ["XBM Support"]=>  bool(true) ["JIS-mapped Japanese Font Support"]=>  bool(false) }


沒碰過這問題, 縮不同大小或固定寬高是否也有同樣情形? 還有產生縮圖方式是什麼?

liteC

  • 憂鬱的高中生
  • ***
  • 文章數: 158
    • 檢視個人資料
    • 軟體
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #2 於: 2009-11-03 19:22 »
縮圖的方式很普通的..

$pic_created_by_original = imagecreatefromjpeg($original_image);
// $original_image 是來源圖片
$pic_making_new_image = imagecreatetruecolor($pic_reduced_width, $pic_reduced_height);
// $pic_reduced_width, $pic_reduced_height 是跑過等比縮小計算函式出來的寬度與長度         
imagecopyresampled($pic_making_new_image, $pic_created_by_original, 0, 0, 0, 0, $pic_reduced_width, $pic_reduced_height, $pic_info['width'], $pic_info['height']);
// $pic_info['width'], $pic_info['height'] 這兩變數是計算原圖尺寸

有問題的圖


搜尋google資料發現也有人討論..但那個點點是發生在右下角. 也沒人解答, 相關提問與解答資料幾乎沒有..
不知道為何偏讓我遇到這鬼打牆的問題. 真煩惱 > <


   
非常謝謝學長們熱心回答我發問的問題
非常感寫 m(_ _)m

liteC

  • 憂鬱的高中生
  • ***
  • 文章數: 158
    • 檢視個人資料
    • 軟體
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #3 於: 2009-11-03 19:37 »
測試過任何大小及尺寸的 jpg 圖檔都可以成功縮圖

但就是左上角會有一點黑點

在上面這三行程式運算後我外加一行把原始圖複製到其它目錄, 並下載該複製圖來看, 是沒有黑點的.. 表示是在 縮圖才產生的.. 快昏倒了

故意右移 1px 貼上縮圖.. 那個黑點也跟著右移..

« 上次編輯: 2009-11-03 19:55 由 liteC »
非常謝謝學長們熱心回答我發問的問題
非常感寫 m(_ _)m

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #4 於: 2009-11-03 19:53 »
那試試用imagecopyresized()看會不會有黑點? 不然就乾脆改用 imagick
以前用imagecopyresampled()也都沒有碰到過這情形, 也許是某些版本的bug吧

liteC

  • 憂鬱的高中生
  • ***
  • 文章數: 158
    • 檢視個人資料
    • 軟體
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #5 於: 2009-11-03 19:59 »
那試試用imagecopyresized()看會不會有黑點? 不然就乾脆改用 imagick
以前用imagecopyresampled()也都沒有碰到過這情形, 也許是某些版本的bug吧

對了, 沒試過.. 剛馬上試一下, 黑點沒有了



但畫質就稍差, imagick是最後的方案了.. 謝謝回應 @@ ^^"
非常謝謝學長們熱心回答我發問的問題
非常感寫 m(_ _)m

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #6 於: 2009-11-03 20:06 »
順便問一下~
樓主用的 linux 與 php 是哪一個版本?

liteC

  • 憂鬱的高中生
  • ***
  • 文章數: 158
    • 檢視個人資料
    • 軟體
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #7 於: 2009-11-03 20:18 »
順便問一下~
樓主用的 linux 與 php 是哪一個版本?

系統是Centos 5, php原本是5.2.9 為了測這個問題升到5.2.11 目前排除php的版本問題
非常謝謝學長們熱心回答我發問的問題
非常感寫 m(_ _)m

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #8 於: 2009-11-03 21:35 »
順便問一下~
樓主用的 linux 與 php 是哪一個版本?

系統是Centos 5, php原本是5.2.9 為了測這個問題升到5.2.11 目前排除php的版本問題


正好有一台 CentOS 5.2, 試了一下, 並沒有這問題

代碼: [選擇]
<?php
/*
CentOS 5.2
System  Linux db1 2.6.18-128.1.10.el5 #1 SMP Thu May 7 10:35:59 EDT 2009 x86_64
PHP Version 5.1.6
Build Date  Apr 7 2009 08:01:45 
GD Version  bundled (2.0.28 compatible) 
*/

$filename = &#39;imgs/snow_013.jpg&#39;;
$percent 0.1;

header(&#39;Content-type: image/jpeg&#39;);

list($width$height) = getimagesize($filename);
$new_width $width $percent;
$new_height $height $percent;

$image_p imagecreatetruecolor($new_width$new_height);
$image imagecreatefromjpeg($filename);
imagecopyresampled($image_p$image0000$new_width$new_height$width$height);
imagejpeg($image_pnull85);
?>

為了避免原圖有黑點, 所以選用一張雪地的圖片
測試結果四個角落都正常, 並未出現多餘的黑點

fillano

  • 鑽研的研究生
  • *****
  • 文章數: 526
    • 檢視個人資料
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #9 於: 2009-11-03 23:14 »
我用yamaka的程式碼來跑,同樣也沒問題耶?

我也是用5.2.11,gd_info()的資訊跟你完全一樣。你的縮放比例式多少?
Sapere aude! Habe Mut, dich deines eigenen Verstandes zu bedienen! ist also der Wahlspruch der Aufklärung.

liteC

  • 憂鬱的高中生
  • ***
  • 文章數: 158
    • 檢視個人資料
    • 軟體
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #10 於: 2009-11-04 06:42 »
縮放比例是當圖片寬 > 高, 且寬超過130px 會縮到寬130px, 高等比
或寬 < 高, 高超過130px 或縮到高 130px, 寬等比
就是強制在 高或寬130px

代碼: (php) [選擇]
<?php
function resize_img_format($width$height) {

if ( $width $height ) {
if ( $width >= 130 ) {
return array(130round(130 * ($height $width)));
} else {
return array($width$height);
}
} else if ( $width $height ) {
if ( $height >= 130 ) {
return array(round(130 * ($width $height)), 130);
} else {
return array($width$height);
}
} else {
if ( $height >= 130 ) {
return array(130130);
} else {
return array($width$height);
}
}
}
?>


剛剛看了其它會員傳的圖片有的成功沒黑點, 約 2/3
我下載了原圖再跟傳一次, 就會產生黑點...... 不知是不是點點和我有仇 :'(

非常謝謝前輩們的回應
« 上次編輯: 2009-11-04 08:28 由 liteC »
非常謝謝學長們熱心回答我發問的問題
非常感寫 m(_ _)m

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #11 於: 2009-11-04 09:28 »
如果有測試的主機換一台試試

fillano

  • 鑽研的研究生
  • *****
  • 文章數: 526
    • 檢視個人資料
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #12 於: 2009-11-04 10:15 »
建議樓主給一張會出問題的圖片來測試...

另外,有問題的圖片色彩格式是什麼?RGBA嗎?
Sapere aude! Habe Mut, dich deines eigenen Verstandes zu bedienen! ist also der Wahlspruch der Aufklärung.

liteC

  • 憂鬱的高中生
  • ***
  • 文章數: 158
    • 檢視個人資料
    • 軟體
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #13 於: 2009-11-04 11:18 »
我...我........... 還是先忙別的好了

謝謝大家的幫忙回應.. 我剛剛半小時前才試過在我另一台Centos主機是很正常的

就那台鬼打牆主機有問題, 我再想找個空閒的星期日早晨先去拜拜後再來詳細查一下鬼打牆的黑點點發生的原因  :'( :'(
非常謝謝學長們熱心回答我發問的問題
非常感寫 m(_ _)m

fillano

  • 鑽研的研究生
  • *****
  • 文章數: 526
    • 檢視個人資料
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #14 於: 2009-11-04 11:29 »
蠻詭異的,有浮點運算bug嗎...
Sapere aude! Habe Mut, dich deines eigenen Verstandes zu bedienen! ist also der Wahlspruch der Aufklärung.

liteC

  • 憂鬱的高中生
  • ***
  • 文章數: 158
    • 檢視個人資料
    • 軟體
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #15 於: 2009-11-04 15:48 »
蠻詭異的,有浮點運算bug嗎...

換算比例時用 round去小數了, 測試過回傳值也都是大於0的整數, 應該不是浮點數的問題
感謝前輩們的回應11
非常謝謝學長們熱心回答我發問的問題
非常感寫 m(_ _)m

fillano

  • 鑽研的研究生
  • *****
  • 文章數: 526
    • 檢視個人資料
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #16 於: 2009-11-04 16:39 »
GD LIBRARY會用浮點數做RGBA的計算,不僅僅是php script的問題。可以參考php-5.2.11的原始碼:/ext/gd/libgd/gd.c裡面的gdImageCopyResampled函數。
Sapere aude! Habe Mut, dich deines eigenen Verstandes zu bedienen! ist also der Wahlspruch der Aufklärung.

liteC

  • 憂鬱的高中生
  • ***
  • 文章數: 158
    • 檢視個人資料
    • 軟體
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #17 於: 2009-11-04 17:03 »
GD LIBRARY會用浮點數做RGBA的計算,不僅僅是php script的問題。可以參考php-5.2.11的原始碼:/ext/gd/libgd/gd.c裡面的gdImageCopyResampled函數。

非常感謝!! 我再查查看!!
非常謝謝學長們熱心回答我發問的問題
非常感寫 m(_ _)m

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #18 於: 2009-11-04 17:55 »
我...我........... 還是先忙別的好了

謝謝大家的幫忙回應.. 我剛剛半小時前才試過在我另一台Centos主機是很正常的

就那台鬼打牆主機有問題, 我再想找個空閒的星期日早晨先去拜拜後再來詳細查一下鬼打牆的黑點點發生的原因  :'( :'(
如果換一台主機就完全沒問題
就換 RAM 吧...GD 是把圖讀出來放到 RAM 裡在 1點1點畫上去
所以gd 縮圖都要用 ini_set 把 memory 調大

liteC

  • 憂鬱的高中生
  • ***
  • 文章數: 158
    • 檢視個人資料
    • 軟體
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #19 於: 2009-11-04 18:10 »
如果換一台主機就完全沒問題
就換 RAM 吧...GD 是把圖讀出來放到 RAM 裡在 1點1點畫上去
所以gd 縮圖都要用 ini_set 把 memory 調大


micmic3學長..您真是太神奇了, 您如果昨天就出現的話我就省掉好多時間啦

本來我設的 ini_set = 64M 想說夠用了. 我改成256M以後.. 這個問題居然就解決了
好奇怪哦.. 呵呵
非常感謝您
非常謝謝學長們熱心回答我發問的問題
非常感寫 m(_ _)m

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #20 於: 2009-11-05 09:05 »
如果換一台主機就完全沒問題
就換 RAM 吧...GD 是把圖讀出來放到 RAM 裡在 1點1點畫上去
所以gd 縮圖都要用 ini_set 把 memory 調大


micmic3學長..您真是太神奇了, 您如果昨天就出現的話我就省掉好多時間啦

本來我設的 ini_set = 64M 想說夠用了. 我改成256M以後.. 這個問題居然就解決了
好奇怪哦.. 呵呵
非常感謝您

那你個 ram 一定有什麼 問題 ...

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: 關於PHP用GD縮圖左上角總會有1px的黑點
« 回覆 #21 於: 2009-11-05 09:57 »
如果換一台主機就完全沒問題
就換 RAM 吧...GD 是把圖讀出來放到 RAM 裡在 1點1點畫上去
所以gd 縮圖都要用 ini_set 把 memory 調大


micmic3學長..您真是太神奇了, 您如果昨天就出現的話我就省掉好多時間啦

本來我設的 ini_set = 64M 想說夠用了. 我改成256M以後.. 這個問題居然就解決了
好奇怪哦.. 呵呵
非常感謝您

那你個 ram 一定有什麼 問題 ...

記憶體有問題的話, 主機跟不定時炸彈差不多吧
不知道哪時候程式跑到這裡可能就當機了

上個月有台新PC每次開VM或複製檔案就當機
發現是記憶體使用到某個量就會當
後來換掉那條記憶體就沒事了