0

カメラインテントから画像を取得するcamerautilクラスがあり、撮影した画像のサイズも変更します。

ただし、撮影した画像は約100K(サイズ変更後)ですが、品質を維持したまま小さくするにはどうすればよいですか。品質が必要なのは、画面にサイズ-x、ymin320ピクセルで表示することだけです。

クラスの圧縮メソッドは次のとおりです。

/*
 * quality Hint to the compressor, 0-100. 0 meaning compress for small size,
 * 100 meaning compress for max quality. Some formats, like PNG which is
 * lossless, will ignore the quality setting 
 */
private boolean c( final String i_ImageFileName, final String i_OutputImageFileName )
{
    BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();

bitmapOptions.inJustDecodeBounds = true;

try 
{
        BitmapFactory.decodeStream( new FileInputStream( i_ImageFileName ),
                                    null,
                                    bitmapOptions );
    }
catch( FileNotFoundException e ) 
{
    Log.e( mTAG, "c()- decodeStream- file not found. " + e.getMessage() );
    return false;
    }

//Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE = 320;
int width_tmp   = bitmapOptions.outWidth;
int height_tmp  = bitmapOptions.outHeight;
int scale       = 1;

while( true )
{
    if( width_tmp  < REQUIRED_SIZE || 
        height_tmp < REQUIRED_SIZE )
    {
        break;
    }

    width_tmp   /= 2;
    height_tmp  /= 2;
    scale       *= 2;
}

// Decode with inSampleSize
BitmapFactory.Options newBitmapOptions = new BitmapFactory.Options();

newBitmapOptions.inSampleSize=scale;

Bitmap newBitmap = null;

    newBitmap = BitmapFactory.decodeFile( /*getImageFile*/(i_ImageFileName)/*.getPath()*/ , newBitmapOptions); 

    ByteArrayOutputStream os = new ByteArrayOutputStream();

newBitmap.compress( CompressFormat.PNG, 
                        100, 
                        os );

    byte[] array = os.toByteArray();

    try 
    {
        FileOutputStream fos = new FileOutputStream(getImageFile( i_OutputImageFileName ));
        fos.write(array);
    } 
    catch( FileNotFoundException e ) 
    {
        Log.e(mTAG, "codec- FileOutputStream failed. " + e.getMessage() );
        return false;
    } 
    catch( IOException e ) 
    {
        Log.e(mTAG, "codec- FileOutputStream failed. " + e.getMessage() );
        return false;
    }

    return true;
}

私は「booKによって」すべてをやっていると思います。

4

1 に答える 1

1

もちろん、サイズと品質はトレードオフの関係にあります。最小のファイル サイズと最高の品質の両方を持つことはできません。あなたはここで最高の品質を求めていますが、適切なサイズでは大きすぎます. だから、品質を下げてください。

PNGの場合、品質設定が何をするのかわかりません(?)。ここではロスレス形式です。(たとえば、100 に設定すると、圧縮が無効になることさえあります。)

これらはどのような画像ですか?ロゴ (写真ではない) のような線画である場合、圧縮された PNG がそれほど大きいとは驚きです。その種の画像データは非常によく圧縮されます。(圧縮がオンであると仮定します!)

写真の場合、うまく圧縮されません。320 x 320 の画像の 100KB は、1 ピクセルあたり約 1 バイトです。これは PNG の 8 ビット カラー テーブルであり、そのファイル サイズまで下げると、256 色でも優れた画質は得られません。

写真ならやっぱりJPGがいいですよね。はるかに適切です。高品質の設定でも、ロッシー エンコーディングは 100KB を簡単に下回るはずです。

于 2012-06-18T07:19:20.670 に答える