如何在存储sdcard之前调整捕获的图像大小?

时间:2013-12-05 09:47:09

标签: android

我正在开发一个应用程序,我希望在将其存储在SD卡的指定文件夹中之前调整其大小。

我已经使用了在SD卡中写入数据所需的所有权限,但我仍然无法做到这一点。

我的代码:

try{
    Bitmap bitmap = Constant.decodeFile(fileName);
    bitmap = Bitmap.createScaledBitmap(bitmap, 480, 320, true);
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, bytes);

    File f = new File(fileName.toString());
    FileOutputStream fo = new FileOutputStream(f);
    fo.write(bytes.toByteArray());
        fo.close();

    }catch (Exception e) {
        e.printStackTrace();
    }catch (OutOfMemoryError o) {
        o.printStackTrace();
}

7 个答案:

答案 0 :(得分:1)

在将数据写入后,您忘记刷新流。在写完数据后使用FileOutputStream.flush() ......和 试试这个...

File file = new File(fileName.toString());
try {
    FileOutputStream stream = new FileOutputStream(file);
    bitmap.compress(CompressFormat.PNG, 100, stream);
    stream.flush();
    stream.close();
} catch (Exception e) {
    // TODO: handle exception
}

答案 1 :(得分:1)

有一个关于调整图像大小的好教程:

BitmapScaler scaler = new BitmapScaler(getResources(), R.drawable.moorwen, newWidth);
imageView.setImageBitmap(scaler.getScaled());

BitmapScaler类如下:

class BitmapScaler {
    private static class Size {
        int sample;
        float scale;
    }

    private Bitmap scaled;

    BitmapScaler(Resources resources, int resId, int newWidth)
            throws IOException {
        Size size = getRoughSize(resources, resId, newWidth);
        roughScaleImage(resources, resId, size);
        scaleImage(newWidth);
    }

    BitmapScaler(File file, int newWidth) throws IOException {
        InputStream is = null;
        try {
            is = new FileInputStream(file);
            Size size = getRoughSize(is, newWidth);
            try {
                is = new FileInputStream(file);
                roughScaleImage(is, size);
                scaleImage(newWidth);
            } finally {
                is.close();
            }
        } finally {
            is.close();
        }
    }

    BitmapScaler(AssetManager manager, String assetName, int newWidth)
            throws IOException {
        InputStream is = null;
        try {
            is = manager.open(assetName);
            Size size = getRoughSize(is, newWidth);
            try {
                is = manager.open(assetName);
                roughScaleImage(is, size);
                scaleImage(newWidth);
            } finally {
                is.close();
            }
        } finally {
            is.close();
        }
    }

    Bitmap getScaled() {
        return scaled;
    }

    private void scaleImage(int newWidth) {
        int width = scaled.getWidth();
        int height = scaled.getHeight();

        float scaleWidth = ((float) newWidth) / width;
        float ratio = ((float) scaled.getWidth()) / newWidth;
        int newHeight = (int) (height / ratio);
        float scaleHeight = ((float) newHeight) / height;

        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);

        scaled = Bitmap.createBitmap(scaled, 0, 0, width, height, matrix, true);
    }

    private void roughScaleImage(InputStream is, Size size) {
        Matrix matrix = new Matrix();
        matrix.postScale(size.scale, size.scale);

        BitmapFactory.Options scaledOpts = new BitmapFactory.Options();
        scaledOpts.inSampleSize = size.sample;
        scaled = BitmapFactory.decodeStream(is, null, scaledOpts);
    }

    private void roughScaleImage(Resources resources, int resId, Size size) {
        Matrix matrix = new Matrix();
        matrix.postScale(size.scale, size.scale);

        BitmapFactory.Options scaledOpts = new BitmapFactory.Options();
        scaledOpts.inSampleSize = size.sample;
        scaled = BitmapFactory.decodeResource(resources, resId, scaledOpts);
    }

    private Size getRoughSize(InputStream is, int newWidth) {
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(is, null, o);

        Size size = getRoughSize(o.outWidth, o.outHeight, newWidth);
        return size;
    }

    private Size getRoughSize(Resources resources, int resId, int newWidth) {
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(resources, resId, o);

        Size size = getRoughSize(o.outWidth, o.outHeight, newWidth);
        return size;
    }

    private Size getRoughSize(int outWidth, int outHeight, int newWidth) {
        Size size = new Size();
        size.scale = outWidth / newWidth;
        size.sample = 1;

        int width = outWidth;
        int height = outHeight;

        int newHeight = (int) (outHeight / size.scale);

        while (true) {
            if (width / 2 < newWidth || height / 2 < newHeight) {
                break;
            }
            width /= 2;
            height /= 2;
            size.sample *= 2;
        }
        return size;
    }
}

http://zerocredibility.wordpress.com/2011/01/27/android-bitmap-scaling/

答案 2 :(得分:1)

您可以使用 createBitmap()来调整原始图像的大小。

以下是参数:

(位图源,int x,int y,int width,int height)

来源我们正在进行子集化的位图

x

中第一个像素的x坐标

y

中第一个像素的y坐标

宽度每行中的像素数

高度行数

示例:

Bitmap newbitmap = Bitmap.createBitmap(originalBitmap, 2, 2, bitmap.getWidth() - 4, bitmap.getHeight() - 120);

答案 3 :(得分:0)

如果您使用PNG格式,那么它将不会压缩您的图像,因为PNG是无损格式。使用JPEG压缩图像,使用0而不是100。

答案 4 :(得分:0)

究竟是什么问题?您的代码是否设法打开文件?它会崩溃还是你没有错误,但没有输出文件?

顺便说一下,你应该在最后调用bitmap.recycle()

答案 5 :(得分:0)

它可以帮助你哈利 crop-image

答案 6 :(得分:0)

BitmapFactory.Options optionsSignature = new BitmapFactory.Options();
final Bitmap bitmapSignature = BitmapFactory.decodeFile(
fileUriSignature.getPath(), optionsSignature);
Bitmap resizedSignature = Bitmap.createScaledBitmap(bitmapSignature, 256, 128, true);
signature.setImageBitmap(resizedSignature);