0

我有一个相机工具类,我用它从相机意图中获取图像,还调整所拍摄图像的大小。

但是拍摄的图像约为 100K(调整大小后),如何在保持质量的情况下使其更小。质量只需要以尺寸显示在屏幕上 - x,y min 320 像素。

下面是类中的压缩方法:

/*
 * 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;
}

我认为我正在“按规定”做所有事情。

4

1 回答 1

1

嗯,当然,尺寸和质量是你权衡的两件事。您不能同时拥有最小的文件大小和最高的质量。您在这里要求最高质量,但尺寸对您来说太大了。所以,拒绝质量。

对于 PNG,我不知道质量设置有什么作用(?)。出于此处的目的,它是一种无损格式。(例如,设置为 100 甚至可能会禁用压缩。)

这些是什么类型的图像?如果它们是线条艺术,例如徽标(不是照片),那么如果压缩的 PNG 有那么大,我会感到惊讶;这种图像数据压缩得很好。(假设压缩是打开的!)

对于照片,它不会很好地压缩。320 x 320 图像的 100KB 大约是每个像素 1 个字节。如果您缩小到该文件大小,那是 PNG 的 8 位颜色表,而 256 色甚至无法提供出色的图像质量。

如果它们是照片,您肯定要使用 JPG。再合适不过了。即使使用高质量设置,它的有损编码也应该很容易低于 100KB。

于 2012-06-18T07:19:20.670 回答