Как получить размер растрового изображения после его отображения в ImageView

У меня есть изображение

<ImageView
        android:id="@+id/imgCaptured"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"
        android:src="@drawable/captured_image" />

Я захватываю изображение с камеры, преобразую это изображение в растровое изображение.

Bitmap thumbnail;
thumbnail = MediaStore.Images.Media.getBitmap(getActivity()
                    .getContentResolver(), imageUri);

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

Log.i("ImageWidth = " + thumbnail.getWidth(), "ImageHeight = "
                + thumbnail.getHeight());

он возвращает меня ImageWidth = 2592 ImageHeight = 1936

после этого я отобразил это растровое изображение в моем изображении выше как imgCaptured.setImageBitmap(thumbnail);, затем я перешел к размеру моего изображения как

Log.i("ImageView Width = " + imgCaptured.getWidth(),
                "ImageView Height = " + imgCaptured.getHeight());

это вернуло меня ImageView Width = 480 ImageView Height = 720

а теперь мой вопрос в том, что

  • Как я могу получить размер этого растрового изображения после его отображения в моем изображении. Я знаю, что это можно сделать с помощью этого

    image.buildDrawingCache();
    Bitmap bmap = image.getDrawingCache();
    

    но это создаст новое растровое изображение размером, равным размеру изображения.

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

Изменить

На самом деле я захватил изображение 2592x1936. Я отобразил это изображение в своем imageView, сделал некоторые другие операции с этим изображением. теперь я хочу сохранить это изображение с тем же разрешением 2592x1936. Является ли это возможным?

Заранее спасибо.


person Qadir Hussain    schedule 28.02.2013    source источник
comment
Чтобы уточнить - вы имеете в виду размер растрового изображения в представлении изображения? Если у вас нет заполнения, они эквивалентны, а ширина/высота ImageView — это ширина/высота растрового изображения. Если у вас есть отступы, просто вычтите их.   -  person Gabe Sechan    schedule 28.02.2013
comment
да, я имею в виду размер растрового изображения после его отображения в изображении.   -  person Qadir Hussain    schedule 28.02.2013
comment
@Gabe Sechan На самом деле я сделал снимок размером 2592x1936. Я отобразил это изображение в своем imageView, сделал некоторые другие операции с этим изображением. теперь я хочу сохранить это изображение с тем же разрешением 2592x1936. Является ли это возможным?   -  person Qadir Hussain    schedule 28.02.2013
comment
Да, но, возможно, не в полном качестве. Если вы сжали изображение (не сохранив полноразмерную версию), вы потеряли данные при его сжатии, и Android будет угадывать, что это за данные, когда он их расширяет. Если вы манипулировали полноразмерной версией, это довольно просто — просто используйте функцию compress() в классе растрового изображения с FileOutputStream.   -  person Gabe Sechan    schedule 28.02.2013
comment
спасибо за ответ. Можете ли вы вставить код, пожалуйста, для получения полноразмерного изображения из изображения с размером 2592x1936.   -  person Qadir Hussain    schedule 28.02.2013


Ответы (1)


После того, как вы отобразите Bitmap в ImageView, ImageView создаст объект BitmapDrawable для его рисования на холсте ImageView. Таким образом, вы можете вызвать метод ImageView.getDrawable(), чтобы получить ссылку на BitmapDrawable, и получить границы, вызвав метод Drawable.getBounds(Rect rect). через границы вы можете вычислить ширину и высоту растрового изображения, нарисованного в ImageView

Drawable drawable = ImageView.getDrawable();
//you should call after the bitmap drawn
Rect bounds = drawable.getBounds();
int width = bounds.width();
int height = bounds.height();
int bitmapWidth = drawable.getIntrinsicWidth(); //this is the bitmap's width
int bitmapHeight = drawable.getIntrinsicHeight(); //this is the bitmap's height
person Tang Ke    schedule 28.02.2013
comment
вылезает эта ошибка. Метод getBounds() в типе Drawable неприменим для аргументов (Rect) - person Qadir Hussain; 28.02.2013
comment
я делал scaleType=fitXY для моего изображения. я удалил это, теперь все работает нормально. большое спасибо - person Qadir Hussain; 28.02.2013
comment
подскажите, пожалуйста, как мне сохранить это изображение с исходным разрешением 2592x1936? - person Qadir Hussain; 28.02.2013
comment
как сказал Кадир, вы должны быть осторожны с атрибутом scaleType. Потому что он изменяет высоту изображения. - person oguzhan; 05.12.2016