java Android - ทำงานกับการปรับขนาด/ครอบตัดรูปภาพโดยทางโปรแกรม

ทั้งหมดนี้ทำให้ฉันทรมานเป็นเวลานานหลายสัปดาห์ ฉันตั้งค่ารูปภาพให้สูง 227 พิกเซลและปรับขนาดเป็น 170 พิกเซล แม้ว่าฉันต้องการให้เป็น wrap_content ทุกครั้งที่ฉันทำก็ตาม

ตกลง. ที่นี่ฉันจะนำรูปภาพของฉันซึ่งมีความยาว 1950 พิกเซล (ฉันใส่บางส่วนไว้ที่นี่เพื่อให้คุณเข้าใจว่าควรมีลักษณะอย่างไร)

ป้อนคำอธิบายรูปภาพที่นี่

ก่อนอื่น ฉันต้องการปรับขนาดกลับเป็นความสูง 227 พิกเซล เพราะนั่นคือวิธีการออกแบบและวิธีที่ควรจะเป็น

Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.ver_bottom_panel_tiled_long);
            int width = bitmapOrg.getWidth();
        int height = bitmapOrg.getHeight();
        int newWidth = 200; //this should be parent's whdth later
        int newHeight = 227;

        // calculate the scale
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;

        // create a matrix for the manipulation
        Matrix matrix = new Matrix();
        // resize the bit map
        matrix.postScale(scaleWidth, scaleHeight);

        // recreate the new Bitmap
        Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, 
                          width, height, matrix, true); 


        BitmapDrawable dmpDrwbl=new BitmapDrawable(resizedBitmap);

    verbottompanelprayer.setBackgroundDrawable(dmpDrwbl);

ดังนั้น... มันไม่ใช่ภาพที่ครอบตัดเลย - ไม่ มันเป็น 1950 พิกเซลที่กดเป็น 200 พิกเซล ป้อนคำอธิบายรูปภาพที่นี่

แต่ฉันต้องการตัดอะไรก็ได้นอกเหนือจาก 200 พิกเซลหรือความกว้างใดก็ตามที่ฉันจะตั้งค่า - ครอบตัดมันและไม่กดรูปภาพยาวทั้งหมดนี้ลงในพื้นที่ 200 พิกเซล

นอกจากนี้ BitmapDrawable (บิตแมปบิตแมป); และ imageView.setBackgroundDrawable (วาดได้); เลิกใช้แล้ว - ฉันจะเปลี่ยนสิ่งนั้นได้อย่างไร


person user2234594    schedule 19.08.2013    source แหล่งที่มา


คำตอบ (1)


จากสิ่งที่ฉันเห็น คุณสร้างบิตแมปขนาดใหม่ (200x227) ดังนั้นฉันจึงไม่แน่ใจว่าคุณคาดหวังอะไร คุณได้เขียนในความคิดเห็นที่คุณปรับขนาดและไม่มีคำพูดเกี่ยวกับการครอบตัด...

สิ่งที่คุณสามารถทำได้คือ:

  1. หาก API มีค่าอย่างน้อย 10 (Gingerbread) คุณสามารถใช้ BitmapRegionDecoder โดยใช้ ถอดรหัสภูมิภาค :

  2. หาก API เก่าเกินไป คุณจะต้องถอดรหัสบิตแมปขนาดใหญ่ จากนั้นครอบตัดเป็นบิตแมปใหม่ โดยใช้ Bitmap.createBitmap

บางอย่างเช่นนี้:

final Rect rect =...
if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD_MR1)
  {
  BitmapRegionDecoder decoder=BitmapRegionDecoder.newInstance(imageFilePath, true);
  croppedBitmap= decoder.decodeRegion(rect, null);
  decoder.recycle();
  }
else 
  {
  Bitmap bitmapOriginal=BitmapFactory.decodeFile(imageFilePath, null);
  croppedBitmap=Bitmap.createBitmap(bitmapOriginal,rect.left,rect.top,rect.width(),rect.height());
  }
person android developer    schedule 19.08.2013
comment
คุณช่วยยกตัวอย่างวิธีการครอบตัดด้วย Bitmap.CreateBitmap ได้ไหม มันยังไม่ครอป แค่พยายามปรับให้พอดีกับภาพทั้งหมด ฉันอาจทำอะไรผิดหรือเปล่า? - person user2234594; 19.08.2013
comment
คุณได้ตรวจสอบลิงก์ที่ฉันเพิ่งให้คุณไปหรือยัง? คุณต้องใช้ฟังก์ชันที่ถูกต้อง อย่างไรก็ตาม ฉันได้เขียนโค้ดตัวอย่างแล้ว แต่ฉันไม่แน่ใจว่ามันจะคอมไพล์ได้ดีหรือไม่ - person android developer; 19.08.2013
comment
นั่นคือปัญหา - ฉันต้องการใช้ BitmapRegionDecoder แต่ใช้ได้กับไฟล์เท่านั้น แต่ฉันต้องการใช้กับทรัพยากร - dpi ที่แตกต่างกัน การทำงานกับไฟล์จะมีความซับซ้อนมากขึ้น มีวิธีใดบ้างที่จะใช้ BitmapRegionDecoder กับทรัพยากร? - person user2234594; 19.08.2013
comment
โปรดอ่านสิ่งที่ฉันให้คุณ ฉันไม่สามารถสอนคุณทุกอย่างเกี่ยวกับ Android ได้ในที่เดียว... ไม่ใช่แค่เรื่องไฟล์เท่านั้น ฉันแค่แสดงตัวอย่างเท่านั้น คุณสามารถใช้ inputStream หรือ fileDescriptor ได้เช่นกัน คุณสามารถใช้ getResources().openRawResource(R.drawable....) ได้ - person android developer; 19.08.2013
comment
มันบ้าสำหรับฉัน........................ ฉันได้รับรูปภาพจากแหล่งข้อมูล .. ต้นฉบับคือ 227 พิกเซล .. ถ้าฉันใช้ getHeight - มันจะคืนค่า 170 พิกเซล ถ้าฉันใส่ไว้ใน bitmap.xml - มันจะเป็น 170 พิกเซล แต่ถ้าผมครอปความสูงจะเป็น 227 พิกเซลอีกครั้ง!!! เกิดอะไรขึ้น??? - person user2234594; 19.08.2013
comment
อาจเป็นปัญหาที่คล้ายกันกับสิ่งนี้: stackoverflow.com/questions/18255572/ ? - person android developer; 19.08.2013
comment
ขอบคุณมากสำหรับลิงค์! การลดขนาดนั้นทำให้เลือดของฉันเสียไปมากในช่วงไม่กี่สัปดาห์ที่ผ่านมา - person user2234594; 19.08.2013
comment
แล้วมันเป็นปัญหาเหรอ? คุณได้วางไฟล์บิตแมปไว้ในที่ที่คุณไม่ต้องการใช่ไหม อย่างไรก็ตามคำตอบอื่นก็ทำโดยฉันเช่นกัน ... - person android developer; 19.08.2013
comment
ปัญหาคือ: คุณมีไฟล์ PNG มีความสูง 227pix คุณใส่ไว้ใน bitmap.xml หรือบิตแมปที่ถอดรหัสจากทรัพยากร คุณวางไว้บนเลย์เอาต์ .. และจะมีความสูง 170 พิกเซล แต่ถ้าคุณครอบตัดมันเพื่อไม่ให้เต็มหน้าจอตามความกว้าง - มันกลับมาแล้ว สูงถึง 227 พิกเซล .. ฉันคิดว่านั่นเป็นข้อบกพร่อง - person user2234594; 20.08.2013
comment
อีกครั้ง คุณแน่ใจหรือว่าได้อ่านสิ่งที่ฉันเขียนแล้ว? คุณใส่ไฟล์รูปภาพไว้ในโฟลเดอร์ใด และเหตุใดคุณจึงสร้างไฟล์ xml มีอะไรอยู่ในไฟล์ xml? ฉันคิดว่าคุณควรแก้ไขคำถามของคุณอีกครั้งเพื่อแสดงให้เห็นว่าคุณกำลังพยายามทำอะไรและคุณได้ทำอะไรไปแล้ว - person android developer; 20.08.2013
comment
ไฟล์ bitmap.xml คืออะไร เอ่อ.... ฉันจะเริ่มจากตรงไหนดี? รูปภาพอยู่ใน res/drawable/xhdpi ฉันทดสอบบนหน้าจอ xhdpi ถ้ามันพอดีกับหน้าจอ - มันจะถูกลดขนาดลงประมาณ 30% หากถูกครอบตัด - มันเป็นขนาดจริง ฉันไม่รู้ว่าฉันสามารถอธิบายเรื่องนี้กับคุณได้ชัดเจนแค่ไหน - person user2234594; 20.08.2013