3

サーバーに保存して再度取得するために、wifiまたはモバイルネットワークを介してネットワーク経由で画像を送信しています。私はそれをしましたが、カメラで撮影した画像のサイズが原因で、アプリの速度が低下しています。ギャラリーを開いてそこから写真を撮っていて、アプリから直接写真を撮っていないことを指摘してください。カメラとギャラリーから取得したwhatsappの画像が約に圧縮されていることに気付きました。100キロバイト。

現時点では、私のコードはファイルを受け取り、それをバイトに変換してから送信します。ファイルを取得してバイトに変換する方法は次のとおりです。

private void toBytes(String filePath){
    try{
        File file = new File(filePath);
        InputStream is = new BufferedInputStream(new FileInputStream(file));  
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        bytes = new byte[(int) filePath.length()];
        int bytes_read;
        while((bytes_read = is.read(bytes, 0, bytes.length)) != -1){
            buffer.write(bytes, 0, bytes_read);
        }
        is.close();               
        bytes = buffer.toByteArray();
    }catch(Exception err){
        Toast.makeText(getApplicationContext(), err.toString(), Toast.LENGTH_SHORT).show();
    }
}

私の質問は、送信する前に画像を圧縮するにはどうすればよいですか? また、アプリが画像を使用する場合、デバイス画面の半分しか占有しないため、画像が高いピクセル数を保持する必要はありません。

助けてくれてありがとう。

4

2 に答える 2

3

BitMap http://developer.android.com/reference/android/graphics/Bitmap.htmlクラスにはメソッドcompressがあります。createScaledBitmapただし、同じクラスでも利用できる画像をスケーリングする必要がある場合があります。

于 2012-04-22T11:34:52.480 に答える
1

次の方法を試してください。

    //decodes image and scales it to reduce memory consumption
    //NOTE: if the image has dimensions which exceed int width and int height
    //its dimensions will be altered.
    private Bitmap decodeToLowResImage(byte [] b, int width, int height) {
        try {
            //Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new ByteArrayInputStream(b), null, o);

            //The new size we want to scale to
            final int REQUIRED_SIZE_WIDTH=(int)(width*0.7);
            final int REQUIRED_SIZE_HEIGHT=(int)(height*0.7);

            //Find the correct scale value. It should be the power of 2.
            int width_tmp=o.outWidth, height_tmp=o.outHeight;
            int scale=1;
            while(true){
                if(width_tmp/2<REQUIRED_SIZE_WIDTH || height_tmp/2<REQUIRED_SIZE_HEIGHT)
                    break;
                width_tmp/=2;
                height_tmp/=2;
                scale*=2;
            }

            //Decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize=scale;
            return BitmapFactory.decodeStream(new ByteArrayInputStream(b), null, o2);
        } catch (OutOfMemoryError e) {
        }
        return null;
    }
于 2012-04-22T11:50:08.350 に答える