0

サーバーにいくつかの画像があり、それらの画像を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();
            }
        });
    }

}

TAG と 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);
}
4

2 に答える 2

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_imageJSONObject で問題なくこれを簡単に渡すことができました。オンザフライを試みたときに文字列に余分な文字を追加していたと思いますが、それらの文字が解析の問題を引き起こしまし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);

このアプローチでは、すべてがスムーズに機能します。

于 2013-03-10T19:55:24.837 に答える
0

json_encode を使ってみましたか? このようなもの:

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

編集:申し訳ありませんが、PHP コードの残りの部分が一番下に表示されています。

EDIT 2:ヘッダーを設定してみてください。

header('Content-Type: application/json');
于 2013-03-10T08:25:04.553 に答える