3

こんにちは、PHPサーバーに高解像度画像をアップロードしたかったのですが、現在、エンコードされた文字列を使用してサーバーに画像を送信しています.ここでの問題は、高解像度画像をアップロードできないため、メモリ不足につながることです. 私の画像のサイズは約 1 ~ 2 Mb です。これは、サーバーに画像をアップロードする方法のスニペットです。

String encodedPagerpath="";
                if(!FILE_PAGER_PATH.equals("") && FILE_PAGER_PATH.length()!=0)
                {
                    byte [] b=imageTobyteArray(FILE_PAGER_PATH,150,150);
                    if(b!=null)
                    {
                        encodedPagerpath=Base64.encodeToString(b, Base64.DEFAULT);
                        if(encodedPagerpath==null || encodedPagerpath.equals("")){
                            encodedPagerpath="";
                        }
                    }
                }

//Convert image into byte array
    static  byte[] imageTobyteArray(String path,int width,int height)
    {   byte[] b = null ;
    if(!path.equals("") || path.length()!=0)
    {


        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        options.inDither=true;//optional
        options.inPreferredConfig=Bitmap.Config.RGB_565;//optional

        Bitmap bm = BitmapFactory.decodeFile(path,options);

        options.inSampleSize = calculateInSampleSize(options, width, height);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;

        bm=BitmapFactory.decodeFile(path,options);


        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        bm.compress(Bitmap.CompressFormat.JPEG, 70, baos); //bm is the bitmap object   
        b= baos.toByteArray();
    }
    return b;
    }

public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            // Calculate ratios of height and width to requested height and width
            final int heightRatio = Math.round((float) height / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);

            // Choose the smallest ratio as inSampleSize value, this will guarantee
            // a final image with both dimensions larger than or equal to the
            // requested height and width.
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }

        return inSampleSize;
    }

このエンコードされた文字列を json オブジェクトで送信しています。私が行くことができるより良いアプローチはありますか?150X150 を超えると、OOM になります。品質を落とさずに高解像度の画像ファイルをアップロードしたい。

4

1 に答える 1

1

POST リクエストで Apache Commons ライブラリ (httpmime.jar) の MultipartEntity を使用して、画像ファイルをアップロードしました。

public static HttpEntity createMultipartBody(File file) throws IOException{
    MultipartEntity entity = new MultipartEntity();
    entity.addPart(key, new FileBody(file));
    return entity;
} 

次に、単純な HttpPost を作成し、それにエンティティを設定してサーバーに送信します。

HttpPost httpPostRequest = new HttpPost(SOME_URL);
httpPostRequest.setEntity(createMultipartBody(SOME_FILE_TO_UPLOAD));

HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(httpPostRequest); 
于 2013-09-10T06:54:16.713 に答える