2015-11-18 7 views
0

Я беру фото с использованием встроенного приложения для камеры и получаю разрешение изображения (1600 x 1200), но я хотел бы сохранить все мои изображения (1200 x 900) на SD-карту для этого я написал метод, но все еще получаю изображения в оригинальном размере.Изменить размер изображения, взятого с камеры перед сохранением

Вот мой код, который я использую для захвата и сохранения изображения в SD-карту

public class FormActivity extends AppCompatActivity { 

String filePath = null; 
File file; 
Uri output; 
final int requestCode = 100; 

String stringImageName= null; 

static int w = 1200; 
static int h = 900; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_form);  

    SimpleDateFormat s = new SimpleDateFormat("ddMMyyyyhhmmss"); 
    stringImageName = s.format(new Date()); 
    Log.d("format::", stringImageName); 

    filePath = Environment.getExternalStorageDirectory() + "/"+stringImageName+".jpeg"; 
    file = new File(filePath); 
    output = Uri.fromFile(file); 


    buttonOrderNow.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      Intent photoCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      photoCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, output);      
      startActivityForResult(photoCaptureIntent, requestCode); 

     } 
    }); 

} 


@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(this.requestCode == requestCode && resultCode == RESULT_OK) { 

     resize(); 

    } 
} 

private void resize() { 

    Long startTime = System.currentTimeMillis(); 

    Bitmap bitmap_Source = BitmapFactory.decodeFile(filePath); 
    float factorH = h/(float)bitmap_Source.getHeight(); 
    float factorW = w/(float)bitmap_Source.getWidth(); 
    float factorToUse = (factorH > factorW) ? factorW : factorH; 
    Bitmap bm = Bitmap.createScaledBitmap(bitmap_Source, 
     (int) (bitmap_Source.getWidth() * factorToUse), 
     (int) (bitmap_Source.getHeight() * factorToUse), 
     false);  

    Long endTime = System.currentTimeMillis(); 
    Long processTime = endTime - startTime; 
    Toast.makeText(FormActivity.this, ""+processTime, Toast.LENGTH_LONG).show(); 

    } 
+0

Вероятно, этот вопрос был downvoted, потому что вы не показываете никаких попыток решить вашу проблему , Даже если вы посмотрите на список «связанных» вопросов справа, вы увидите [Изменить размер изображения, взятого из галереи или камеры, перед загрузкой] (http://stackoverflow.com/questions/23813604/resize-image-taken- from-gallery-or-camera-before-being-uploaded? rq = 1), который обеспечивает жизнеспособный ответ. –

+0

@AlexCohn проверяет мой обновленный код, я дал свою попытку, но все еще проблема не решена. – Sun

+0

Обрезка позволяет изменить размер изображений на небольшие KB's http://stackoverflow.com/questions/29532914/android-intent-with-multiple-option- ie-pick-image-from-gallary-and-capture-im/29560548 # 29560548 –

ответ

0

Взято из here.

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(this.requestCode == requestCode && resultCode == RESULT_OK){ 
     Bitmap photo = (Bitmap) data.getExtras().get("data"); 
     //Resize it as you need 
     Bitmap resized = Bitmap.createScaledBitmap(yourBitmap, 1200, 900, true); 

     //Now you can save it 
    } 
} 
0

Я предполагаю, что это, и должны пройти высоту значения и ширина Пройдите свой путь изображения и получить точное изображение

private Bitmap getBitmap(String path) { 

Uri uri = getImageUri(path); 
InputStream in = null; 
try { 
    final int IMAGE_MAX_SIZE = 1920000; // 1.9MP 
    in = mContentResolver.openInputStream(uri); 
    // Decode image size 
    BitmapFactory.Options o = new BitmapFactory.Options(); 
    o.inJustDecodeBounds = true; 
    BitmapFactory.decodeStream(in, null, o); 
    in.close(); 
    int scale = 1; 
    while ((o.outWidth * o.outHeight) * (1/Math.pow(scale, 2)) > 
      IMAGE_MAX_SIZE) { 
     scale++; 
    } 
    Log.d(TAG, "scale = " + scale + ", orig-width: " + o.outWidth + ", 
     orig-height: " + o.outHeight); 
    Bitmap b = null; 
    in = mContentResolver.openInputStream(uri); 
    if (scale > 1) { 
     scale--; 
     // scale to max possible inSampleSize that still yields an image 
     // larger than target 
     o = new BitmapFactory.Options(); 
     o.inSampleSize = scale; 
     b = BitmapFactory.decodeStream(in, null, o); 

     // resize to desired dimensions 
     int height = b.getHeight(); 
     int width = b.getWidth(); 
     Log.d(TAG, "1th scale operation dimenions - width: " + width + ", 
      height: " + height); 

     double y = Math.sqrt(IMAGE_MAX_SIZE 
       /(((double) width)/height)); 
     double x = (y/height) * width; 

     Bitmap scaledBitmap = Bitmap.createScaledBitmap(b, (int) x, 
      (int) y, true); 
     b.recycle(); 
     b = scaledBitmap; 

     System.gc(); 
    } else { 
     b = BitmapFactory.decodeStream(in); 
    } 
    in.close(); 

    Log.d(TAG, "bitmap size - width: " +b.getWidth() + ", height: " + 
     b.getHeight()); 
    return b; 
} catch (IOException e) { 
    Log.e(TAG, e.getMessage(),e); 
    return null; 
} 
Смежные вопросы