2013-03-10 46 views
0

我在服务器中有一些图像,我想用php获取这些图像,调整它们的大小并传递给我的Android应用程序。我用下面的代码来调整图像:如何用php获取图片,调整大小并传递给Android

<?php 
$image = imagecreatefromjpeg("test.jpg"); 

$original_image_width = imagesx($image); 
$original_image_height = imagesy($image); 

$resize_ratio = 0.5; 

$resized_height = $original_image_height * $ratio; 
$resized_width = $original_image_width* $ratio; 

$new_image = imagecreatetruecolor($resized_width, $resized_height); 
$resized_image = imagecopyresampled($new_image, $image, 0, 0, 0, 0, $resized_width, $resized_height, $original_image_width, $original_image_height); 
?> 

我不知道如何通过resized_image后到Android。我使用JSONObject和makeHttpRequest在我的应用程序和服务器之间传递字符串变量,一切正常。我试图resized_image转换为Base64字符串与下面的代码:

<?php 
$thumbnail = imagejpeg($resized_image); 
$thumbnail_base64 = base64_encode($thumbnail); 
?> 

并将它传递这样的,但我得到了“java.lang.String类型不能被转换为JSONObject的”错误。

对我来说,将它传递给我的Android应用程序的最佳方法是什么?如果有人可以告诉我如何传递base64字符串,我可以在Android端处理其余部分。提前致谢。

编辑:我的Android代码如下:

class getAllReports extends AsyncTask<String, String, String> { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(ShowAllReportsActivity.this); 
     pDialog.setMessage(getResources().getString(R.string.getting_reports)); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(false); 
     pDialog.show(); 
    } 

    protected String doInBackground(String... args) { 
     List<NameValuePair> params = new ArrayList<NameValuePair>(); 
     JSONObject json = jParser.makeHttpRequest(url_all_reports, 
       "GET", params); 
     Log.d("Reports: ", json.toString()); 

     try { 
      int success = json.getInt(TAG_SUCCESS); 

      if (success == 1) { 
       reports = json.getJSONArray(TAG_REPORTS); 

       for (int i = 0; i < reports.length(); i++) { 
        JSONObject c = reports.getJSONObject(i); 

        callNoArrayList.add(c.getString(TAG_CALL_NO)); 
        yearArrayList.add(c.getString(TAG_YEAR)); 
        modelArrayList.add(c.getString(TAG_MODEL)); 
        tumbnailArrayList.add(c.getString(TAG_THUMBNAIL); 
       } 
      } else { 
       Intent i = new Intent(getApplicationContext(), 
         MainActivity.class); 
       i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(i); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 
    protected void onPostExecute(String file_url) { 
     long delayInMillis = 500; 
     Timer timer = new Timer(); 
     timer.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       pDialog.dismiss(); 
      } 
     }, delayInMillis); 
     runOnUiThread(new Runnable() { 
      public void run() { 
       populateList(); 
      } 
     }); 
    } 

} 

标签和在的ArrayList主类进行初始化。

休息的我的PHP代码:

$db = new DB_CONNECT(); 
mysql_query('SET CHARACTER SET utf8'); 

$result = mysql_query("SELECT *FROM reports") or die(mysql_error()); 

if (mysql_num_rows($result) > 0) { 
$response["reports"] = array(); 

while ($row = mysql_fetch_array($result)) { 
    $report = array(); 
    $report["call_no"] = $row["call_no"]; 
    $report["year"] = $row["year"]; 
    $report["model"] = $row["model"]; 
    $report["thumbnail"] = $thumbnail_base64; 
    array_push($response["reports"], $report); 
} 
$response["success"] = 1; 

echo json_encode($response); 
} else { 
$response["success"] = 0; 
$response["message"] = "No reports found"; 

echo json_encode($response); 
} 
+0

如果你的Android应用程序期望json只是在json中编码你的php脚本的输出。 – Musa 2013-03-10 07:14:18

+0

@Musa,我也试过,但得到了同样的错误。 – 2013-03-10 07:17:24

+1

你可以发布你的android代码吗? – Musa 2013-03-10 07:19:37

回答

1

我解决了这个问题有不同的方法。我没有试图通过$resized_image即时通过数据,而是先将它保存在一个临时位置,base64对它进行了编码,并通过了JSONObject并且一切正常。完成后,我从目录中删除临时文件。这里是PHP代码做到这一点:

imagejpeg($resized_image, "tempimage.jpg", 75); 
$file = file_get_contents("tempimage.jpg"); 
$base64_image = base64_encode($file); 
unlink('tempimage.jpg'); 

我可以很容易地通过这个$base64_image而不JSONObject的一个问题。我想这是在我试图base64_encode$resized_image的时候给这个字符串增加了一些额外的字符,这些字符导致了解析问题。

后,我得到的编码在Android我解码,并将其转换为以下代码为位图字符串中的Base64:

String mThumbnail = thumbnailArrayList.get(position); 
    byte[] decodedString = Base64.decode(mThumbnail, Base64.DEFAULT); 
    Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 
    mReportImage.setImageBitmap(decodedByte); 

一切正常顺利地使用这种方法。

0

您是否尝试过使用json_encode?事情是这样的:

$msg= array( 
     'image' => $image 
    ); 
    echo json_encode($msg); 

编辑:对不起,刚才看到你的PHP代码的其余部分在底部。

编辑2:也许你可以尝试设置标题?

header('Content-Type: application/json'); 
+0

无效,同样的错误:/ – 2013-03-10 18:35:13