2014-09-22 3 views
0

Как изменить размер 2 изображений в android, так как одно изображение, которое остается постоянным (.png изображение в папке с возможностью рисования), должно быть равно размеру входного изображения (изображение вводится от пользователя из мобильной галереи). Я использую функцию resize(src, dst) в opencv для изменения размера двух изображений, не имею никакого представления об этой функции в конце java, поскольку я также проверяю this post, но она выглядит для меня какой-то дополнительной загруженной работой.Как изменить размер входного изображения

ответ

1

Я знаю некоторый метод об операции изображения в android.

Transform Drawable в растр

public static Bitmap drawableToBitmap(Drawable drawable) { 
    int width = drawable.getIntrinsicWidth(); 
    int height = drawable.getIntrinsicHeight(); 
    Bitmap bitmap = Bitmap.createBitmap(width, height, drawable 
      .getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 
      : Bitmap.Config.RGB_565); 
    Canvas canvas = new Canvas(bitmap); 
    drawable.setBounds(0, 0, width, height); 
    drawable.draw(canvas); 
    return bitmap; 
} 

Изменение размера растрового изображения:

public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) { 
    int width = bitmap.getWidth(); 
    int height = bitmap.getHeight(); 
    Matrix matrix = new Matrix(); 
    float scaleWidht = ((float) w/width); 
    float scaleHeight = ((float) h/height); 
    matrix.postScale(scaleWidht, scaleHeight); 
    Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, 
      matrix, true); 
    return newbmp; 
} 

Вы можете превратить свой первый рисуем изображение в Bitmap, а затем изменить его размер со вторым способом. Используйте getWidth() и getHeight(), чтобы получить параметры изображения.

Я не знаю, является ли это лучшим решением. Если я не понял ваши намерения, сделайте комментарий, и я могу отредактировать свой ответ.

Edit:

Вы можете получить Uri или путь права изображения?

Если вы получаете Uri, используйте String path = uri.getPath();, чтобы получить путь.

Тогда

Decode Bitmap из файла:

public static Bitmap getBitmap(String path) { 
    return BitmapFactory.decodeFile(String path); 
} 

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

Но если вы не знаете размер, я рекомендую следующий метод.

Decode BitmapDrawable от пути:

public static BitmapDrawable getScaledDrawable(Activity a, String path) { 
    Display display = a.getWindowManager().getDefaultDisplay(); 
    float destWidth = display.getWidth(); 
    float destHeight = display.getHeight(); 

    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(path, options); 

    float srcWidth = options.outWidth; 
    float srcHeight = options.outHeight; 

    int inSampleSize = 1; 
    if (srcHeight > destHeight || srcWidth > destWidth) { 
     if (srcWidth > srcHeight) { 
      inSampleSize = Math.round(srcHeight/destHeight); 
     } else { 
      inSampleSize = Math.round(srcWidth/destWidth); 
     } 
    } 

    options = new BitmapFactory.Options(); 
    options.inSampleSize = inSampleSize; 

    Bitmap bitmap = BitmapFactory.decodeFile(path, options); 
    return new BitmapDrawable(a.getResources(), bitmap); 
} 

Этот метод возвращает объект масштабируется BitmapDrawable, чтобы предотвратить утечку памяти.

Если вам нужно Bitmap не BitmapDrawable, просто верните растровое изображение.

Edit2:

ThirdActivity.java:

public class ThirdActivity extends ActionBarActivity { 

    private static final int REQUEST_IMAGE = 0; 

    private Bitmap bitmapToResize; 

    private Button mGetImageButton; 
    private Button mResizeButton; 
    private ImageView mImageViewForGallery; 
    private ImageView mImageVIewForDrable; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_third); 
     mGetImageButton = (Button) findViewById(R.id.button_getImage); 
     mGetImageButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       // SET action AND miniType 
       Intent intent = new Intent(); 
       intent.setAction(Intent.ACTION_PICK); 
       intent.setType("image/*"); 
       // REQUEST Uri of image 
       startActivityForResult(intent, REQUEST_IMAGE); 
      } 
     }); 

     mResizeButton = (Button) findViewById(R.id.button_resize); 
     mResizeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       resize(); 
      } 
     }); 

     mImageViewForGallery = (ImageView) findViewById(R.id.imageView); 

     mImageVIewForDrable = (ImageView) findViewById(R.id.imageViewFromDrable); 
     mImageVIewForDrable.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher)); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode != Activity.RESULT_OK) {return;} 

     if (requestCode == REQUEST_IMAGE) { 
      Uri uri = data.getData(); 
      // SET image 
      mImageViewForGallery.setImageURI(uri); 
      Drawable drawable = mImageViewForGallery.getDrawable(); 
      Log.e("asd", "Height:" + drawable.getIntrinsicHeight()); 
      Log.e("asd", "Width:" + drawable.getIntrinsicWidth()); 
     } 
    } 

    private void resize() { 
     if (mImageViewForGallery.getDrawable() != null) { 
      bitmapToResize = drawableToBitmap(mImageVIewForDrable.getDrawable()); 
      int width = mImageViewForGallery.getDrawable().getIntrinsicWidth(); 
      int height = mImageViewForGallery.getDrawable().getIntrinsicHeight(); 
      bitmapToResize = zoomBitmap(bitmapToResize, width, height); 
      mImageVIewForDrable.setImageBitmap(bitmapToResize); 
     } else { 
      Log.e("asd", "setImageFirst"); 
     } 

    } 

    public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) { 
     int width = bitmap.getWidth(); 
     int height = bitmap.getHeight(); 
     Matrix matrix = new Matrix(); 
     float scaleWidht = ((float) w/width); 
     float scaleHeight = ((float) h/height); 
     matrix.postScale(scaleWidht, scaleHeight); 
     Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, 
       matrix, true); 
     return newbmp; 
    } 

    public static Bitmap drawableToBitmap(Drawable drawable) { 
     int width = drawable.getIntrinsicWidth(); 
     int height = drawable.getIntrinsicHeight(); 
     Bitmap bitmap = Bitmap.createBitmap(width, height, drawable 
       .getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 
       : Bitmap.Config.RGB_565); 
     Canvas canvas = new Canvas(bitmap); 
     drawable.setBounds(0, 0, width, height); 
     drawable.draw(canvas); 
     return bitmap; 
    } 

} 

activity_third.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:background="@android:color/darker_gray" 
    tools:context="com.ch.summerrunner.ThirdActivity"> 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="@android:color/darker_gray"> 



      <Button 
       android:id="@+id/button_getImage" 
       android:text="@string/gallery" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" /> 
      <Button 
       android:id="@+id/button_resize" 
       android:text="@string/resize" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_marginLeft="16dp" 
       android:layout_toRightOf="@id/button_getImage"/> 

      <ImageView 
       android:id="@+id/imageView" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="8dp" 
       android:background="@android:color/white" 
       android:layout_below="@id/button_getImage"/> 

      <ImageView 
       android:id="@+id/imageViewFromDrable" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:background="@android:color/white" 
       android:layout_below="@id/imageView"/> 
     </RelativeLayout> 

    </ScrollView> 

</RelativeLayout> 
+0

Где вы имеете дело с входным изображением? – AHF

+0

Входное изображение из файловой системы или Интернета? Или камера? –

+0

из мобильной галереи – AHF

0
Bitmap bmpIn = BitmapFactory.decodeResource(view.getResources(), R.drawable.image); 
    BitMap bmpOut = Bitmap.createScaledBitmap(bmpIn, width, height, false); 
+0

У меня уже есть изображения как на входе, так и на один уже в папке с возможностью переноса – AHF

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