รับ Bitmap ที่แนบมากับ ImageView


314

ป.ร. ให้ไว้

ImageView image = R.findViewById(R.id.imageView);
image.setImageBitmap(someBitmap);

เป็นไปได้หรือไม่ที่จะรับบิตแมป


1
ใช่มันเป็นไปได้เมื่อคุณคลิกที่ภาพเราจะได้รับถ้าคุณต้องการความต้องการนี้แจ้งให้เราทราบ
RajaReddy PolamReddy

คำตอบ:


809
Bitmap bitmap = ((BitmapDrawable)image.getDrawable()).getBitmap();

34
ใช้ความระมัดระวังเพื่อตรวจสอบว่าคุณimage.getDrawable()สามารถส่งไปที่BitmapDrawable(เพื่อหลีกเลี่ยงIllegalCastExceptions) จริงหรือไม่ ตัวอย่างเช่นหากคุณใช้เลเยอร์ในภาพของคุณตัวอย่างนี้จะแตกต่างกันเล็กน้อย:Bitmap bitmap = ((BitmapDrawable)((LayerDrawable)image.getDrawable()).getDrawable(0)).getBitmap();
Alex Semeniuk

2
ในบางครั้งจะส่งคืนบิตแมปด้วยพิกเซลสีดำบางส่วนหรือทั้งหมด

2
สิ่งนี้จะไม่ส่งคืนบิตแมปดั้งเดิมหรือบิตแมปที่กรองถ้าคุณใช้กับ drawable / imageview
DearDhruv

4
การทำงานนี้ถ้าในภาพImageViewมีการตั้งค่าจากURI? imageView.setImageUri()
Hendra Anggrian

1
@praneethkumar มันทำงานในสถานการณ์ของฉัน ยกนิ้วให้สำหรับคำตอบที่ยอดเยี่ยมนี้!
Hendra Anggrian

46

นี้คุณจะได้รับจากBitmap ImageViewแม้ว่ามันจะไม่ใช่วัตถุบิตแมปเดียวกันกับที่คุณตั้งไว้ มันคืออันใหม่

imageView.buildDrawingCache();
Bitmap bitmap = imageView.getDrawingCache();

=== แก้ไข ===

 imageView.setDrawingCacheEnabled(true);
 imageView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
                   MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
 imageView.layout(0, 0, 
                  imageView.getMeasuredWidth(), imageView.getMeasuredHeight()); 
 imageView.buildDrawingCache(true);
 Bitmap bitmap = Bitmap.createBitmap(imageView.getDrawingCache());
 imageView.setDrawingCacheEnabled(false);

เมื่อ "ไม่ทำงาน" จะเกิดอะไรขึ้น มันกลับมาเป็นโมฆะหรือโยนข้อยกเว้นหรืออะไร
Sarwar Erfan

2
มันจะคืนค่าว่างเปล่า บางครั้งฉันต้องโหลดหน้าซ้ำเพื่อให้ปรากฏจริง
เลมอน

3
ให้ตัวชี้เป็นโมฆะ :( ในบรรทัดนี้:Bitmap bmap = Bitmap.createBitmap(mImageView.getDrawingCache());
Azurespot

drawingCache เลิกใช้แล้วใน Kotlin
Raju yourPepe

3

เขียนรหัสด้านล่าง

ImageView yourImageView = (ImageView) findViewById(R.id.yourImageView);
Bitmap bitmap = ((BitmapDrawable)yourImageView.getDrawable()).getBitmap();

ฉันได้ AppCompatImageView ไม่สามารถส่งไปยัง android.graphics.drawable.BitmapDrawable
Billyjoker

1

สำหรับผู้ที่กำลังมองหาKotlinวิธีการแก้ปัญหาที่จะได้รับจากBitmapImageView

var bitmap = (image.drawable as BitmapDrawable).bitmap

ฉันได้ AppCompatImageView ไม่สามารถส่งไปยัง android.graphics.drawable.BitmapDrawable
Billyjoker

0

รหัสนี้ดีกว่า

public static  byte[] getByteArrayFromImageView(ImageView imageView)
    {
        BitmapDrawable bitmapDrawable = ((BitmapDrawable) imageView.getDrawable());
        Bitmap bitmap;
        if(bitmapDrawable==null){
            imageView.buildDrawingCache();
            bitmap = imageView.getDrawingCache();
            imageView.buildDrawingCache(false);
        }else
        {
            bitmap = bitmapDrawable .getBitmap();
        }
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
        return stream.toByteArray();
    }

มันคือ imageView.getDrawable (); -> หมายถึงการรับภาพจากโฟลเดอร์ drawable? CMIIW .... @Ahmad
gumuruh

ไม่คุณสามารถใช้รหัสนี้ได้ Bitmap imagenAndroid = BitmapFactory.decodeResource(getResources(),R.drawable.jellybean_statue);
Ahmad Aghazadeh

-3

วิธีอื่นในการรับบิตแมปของรูปภาพกำลังทำสิ่งนี้:

Bitmap imagenAndroid = BitmapFactory.decodeResource(getResources(),R.drawable.jellybean_statue);
imageView.setImageBitmap(imagenAndroid);

-10

ลองรหัสนี้:

Bitmap bitmap;
bitmap = ((BitmapDrawable)image.getDrawable()).getBitmap();

6
คุณช่วยอธิบายการปรับปรุงคำตอบที่ได้รับการยอมรับของ @Arslan ได้ไหม
bummi

คุณควรอธิบายว่าทำไมคำตอบของคุณถึงแก้ปัญหาของเขาได้ดีกว่า
Muhammed Refaat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.