2013-12-05 5 views
4

Я разрабатываю приложение, в котором я хочу изменить размер захваченного изображения, прежде чем хранить его в указанной папке sdcard.Как изменить размер захваченного изображения перед сохранением в sdcard?

Я использовал все разрешения, необходимые для записи данных на 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(); 
} 
+2

Могу ли я спросить .. как вы подтверждаете, что изображение не изменяется? Вы смотрите на размер файла или изображение 'width x height'? Каков результат, который вы получаете, и каков ожидаемый результат? –

ответ

1

Вы забыли очистить поток после записи данных в INTO. использовать 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

Что такое флеш() именно для? – SteBra

+0

@Stebra см. Здесь http://developer.android.com/reference/java/io/OutputStream.html#flush%28%29 –

+0

Могу ли я узнать причину, по которой это запрещено? –

0

, если вы используете формат PNG, то он не будет сжимать изображение, потому что PNG является формат без потерь. используйте JPEG для сжатия вашего изображения и используйте 0 вместо 100 в качестве.

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/

0

В чем проблема именно? Не удается ли вашему коду открыть файл? это сбой или у вас просто нет ошибки, но нет выходного файла?

Кстати, вы должны вызвать bitmap.recycle() в конце

1

Вы можете использовать CreateBitmap() изменить размер исходного изображения.

являются следующие параметры:

(источник растровых изображений, Int х, Int у, ширина INT, INT высота)

источник Растровое мы Подменю

х Х координата первого пикселя в источнике

y Координата y первого пикселя в так называемом urce

ширина Количество пикселей в каждой строке

высота Число строк

Пример:

Bitmap newbitmap = Bitmap.createBitmap(originalBitmap, 2, 2, bitmap.getWidth() - 4, bitmap.getHeight() - 120); 
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); 
+0

Пожалуйста, объясните свои Ans. – GAMITG

+0

Внутри я получаю изображение в bitmapSignature, после этого с помощью метода Bitmap.createScaledBitmap() я перерисовываю захваченное изображение, которое хранится в bitmapSignature в размере 256 * 128 изображений ... –

Смежные вопросы