2012-07-26 72 views
3

在以下代碼中,以db存儲一個jpg,我需要知道如何首先將jpg更改爲40%的質量,然後保存?我試圖與imagejpg,但它可以節省空文件:如何更改jpg質量導出?

function exportGraphics($table_name) 
{ 
    $odbc_query = "SELECT * FROM " . $table_name; 
    mkdir("TI/" . $table_name); 

    $data = odbc_exec($this->odbc_id, $odbc_query); 
    odbc_longreadlen($data, 10485760); // 10MB = 10485760 
    while (odbc_fetch_row($data)) { 
     $row = odbc_fetch_array($data); 
     if ($row['GRD_ID'] != "") { 
      $file_name_jpg = "TI/" . $table_name . "/" . $row['GRD_ID'] . ".jpg"; 
      $file = fopen($file_name_jpg, "w"); 
      fputs($file, $row['GRD_GRAPHIC']); 
      fclose($file); 
      set_time_limit(3600); 
      unset($row); 
     } 
    } 
    print "Ýêñïîðò êàðòèíîê èç òàáëèöû " . $table_name . " çàâåðøåí!"; 
} 

警告:imagecreatefromstring()[function.imagecreatefromstring]:GD 警告:一個參數到存儲器分配乘法是 負或零,不能操作在正常 X:\ denwer \ WWW \ denwer \ tecdoc3.php上線103

警告:imagecreatefromstring()[function.imagecreatefromstring]: 傳遞數據不是 'WBMP' 格式中 X:\ denwer \ www \ denwer \ tecdoc3.php上線103

警告:imagecreatefromstring()[function.imagecreatefromstring]:\ denwer \ WWW \ denwer \ tecdoc3.php上線103

警告: 無法在 X創建GD圖像​​流出數據的:imagecreatefromstring()[function.imagecreatefromstring]:GD 警告:一個參數到存儲器分配乘法是 負或零,不能正常在 X操作:行\ denwer \ WWW \ denwer \ tecdoc3.php 103

原始碼:

function exportGraphics($table_name) { 
$odbc_query = "SELECT * FROM " . $table_name; 
mkdir("TI/" . $table_name); 

$data = odbc_exec($this->odbc_id, $odbc_query); 
odbc_longreadlen($data, 10485760); //10MB = 10485760 
while(odbc_fetch_row($data)) 
{ 
$row = odbc_fetch_array($data); 
if($row['GRD_ID'] != "") { 
$file_name_jp2 = "TI/" . $table_name . "/" . $row['GRD_ID'] . ".jp2"; 
$file = fopen ($file_name_jp2, "w"); 
fputs($file, $row['GRD_GRAPHIC']); 
fclose($file); 
set_time_limit(0); 
unset($row); 
} 
} 
print "Ýêñïîðò êàðòèíîê èç òàáëèöû " . $table_name . " çàâåðøåí!"; 
} 

回答

2

試試這個:

function exportGraphics($table_name) { 
    $odbc_query = "SELECT * FROM " . $table_name; 
    mkdir("TI/" . $table_name); 

    $data = odbc_exec($this->odbc_id, $odbc_query); 
    odbc_longreadlen($data, 10485760); //10MB = 10485760 
    while(odbc_fetch_row($data)) 
    { 
     $row = odbc_fetch_array($data); 
     if($row['GRD_ID'] != "") { 
      $file_name_jpg = "TI/" . $table_name . "/" . $row['GRD_ID'] . ".jpg"; 

      // create GD graphic from string, call imagejpeg to save new image 
      $im = imagecreatefromstring($row['GRD_GRAPHIC']); 
      imagejpeg($im, $file_name_jpg, 40); 

      set_time_limit(3600); 
      unset($row); 
     } 
    } 
    print "Ýêñïîðò êàðòèíîê èç òàáëèöû " . $table_name . " çàâåðøåí!"; 
} 

或者是你的努力到底是什麼?

如果由於某種原因不工作,你可以嘗試:

$im = imagecreatefromstring($row['GRD_GRAPHIC']); 
ob_start(); 
imagejpeg($im, null, 40); 
$imgData = ob_get_contents(); 
ob_end_clean(); 

$file = fopen ($file_name_jpg, "w+b"); 
fputs($file, $imgData); 
fclose($file); 

編輯:原因GD不工作是因爲它不支持JPEG-2000文件格式

可能的解決方法:在服務器上安裝imagemagick,並嘗試這樣的代碼:

$file_name_jpg = "TI/" . $table_name . "/" . $row['GRD_ID'] . ".jp2"; 
$file_out_jpg = str_replace('.jp2', '.jpg', $file_name_jpg); 

file_put_contents($file_name_jpg, $row['GRD_GRAPHIC']); 

// execute imagemagick convert to change to jpeg with quality 40 
exec("/usr/bin/convert $file_name_jpg -quality 40 -format jpg $file_out_jpg"); 
unlink($file_name_jpg); // get rid of temp jp2 file 
+0

什麼意思的警告(加質疑) – byCoder 2012-07-27 09:30:21

+0

我認爲這行'$ im = imagecreatefromstring($ row ['GRD_GRAPHIC']);'失敗,因爲PHP不認爲'$ row ['GRD_GRAPHIC']'是有效的圖像數據。這種數據是以任何方式進行編碼的(例如base64),它應該是什麼圖像格式,JPG? – drew010 2012-07-27 14:14:20

+0

jp2必須,我添加了原始腳本 – byCoder 2012-07-27 20:03:17