20.11.2016 Views

ANDROID APP

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

148 บทที่ 6 เทคนิคการทำางานร่วมกับมัลติมีเดีย<br />

ถ้าเราจะพัฒนาแอพที่เกี่ยวข้องกับการบันทึกข้อมูลสื่อมัลติมีเดีย เราจะต้องกำหนดสิทธิ์การเข้า<br />

ถึงการทำงานของระบบปฏิบัติการในไฟล์ Android Manifest ตามนี้<br />

<br />

<br />

รูปภาพ<br />

การใช้รูปภาพในแอพ เราจะนำรูปภาพใส่ไว้ในไดเร็กทอรี res/drawable/ ซึ่งมันจะถูกรวมเข้า<br />

กับแอพขณะที่ทำการคอมไพล์ ในการเขียนชุดคำสั่งนั้น เราสามารถเรียกใช้รูปภาพเหล่านี้ได้ด้วยการ<br />

อ้างอิงรีซอร์ส เช่น R.drawable.my_picture ส่วนรูปภาพที่จัดเก็บอยู่ในระบบไฟล์ภายในหน่วย<br />

ความจำของอุปกรณ์แอนดรอยด์นั้น เราจะใช้งานด้วยคลาสจาวา เช่น InputStream แต่อย่างไร<br />

ก็ตามวิธีที่อยากแนะนำในการอ่านข้อมูลภาพเข้าสู่หน่วยความจำเพื่อปรับแต่งหรือแก้ไขนั้น เราจะใช้<br />

คลาสที่มีอยู่ในระบบปฏิบัติการแอนดรอยด์อยู่แล้ว คือคลาส BitmapFactory<br />

คลาส BitmapFactory จะใช้ในการสร้างออบเจ็กต์ของบิตแม็พด้วยข้อมูลจากไฟล์หรืออาร์เรย์<br />

ต่างๆ ดังคำสั่งนี้<br />

Bitmap myBitmap1 = BitmapFactory.decodeResource(getResources(),<br />

R.drawable.my_picture);<br />

Bitmap myBitmap2 = BitmapFactory.decodeFile(filePath);<br />

หลังจากที่ข้อมูลรูปภาพถูกอ่านเข้าสู่หน่วยความจำแล้ว ข้อมูลเหล่านี้ก็จะอยู่ในสถานะที่สามารถ<br />

ใช้เมธอดที่เกี่ยวข้องเช่น getPixel() และ setPixel() มาจัดการรูปภาพได้ แต่ในความเป็นจริงนั้น<br />

รูปภาพส่วนใหญ่มักจะมีขนาดใหญ่เกินกว่าที่จะนำข้อมูลทั้งหมดไปไว้ในหน่วยความจำได้ ซึ่งจะมีปัญหา<br />

กับอุปกรณ์แอนดรอยด์ที่มีหน่วยความจำไม่มาก ดังนั้นเราจะใช้วิธีอ่านบางส่วนของภาพเข้าสู่หน่วย<br />

ความจำแทน ดังนี้<br />

Bitmap bm = Bitmap.createScaledBitmap(myBitmap2, 480, 320, false);<br />

จากคำสั่งข้างต้นจะช่วยหลีกเลี่ยงการเกิดข้อผิดพลาดในกรณีที่หน่วยความจำไม่พอได้<br />

กรรมวิธี: การจัดการไฟล์รูปภาพ<br />

ในส่วนนี้จะเป็นการแสดงตัวอย่างของการตัดรูปภาพออกเป็น 4 ชิ้น และสลับก่อนที่จะนำไป<br />

แสดงผลบนจอภาพ ซึ่งจะแสดงวิธีการสร้างรายการของรูปภาพที่เลือกได้<br />

เมื่ออุปกรณ์แอนดรอยด์มีการถ่ายรูป รูปที่ถ่ายจะเก็บลงในไดเร็กทอรี DCIM/Camera/ ซึ่งเรา<br />

จะหยิบรูปภาพในไดเร็กทอรีนี้มาใช้ประกอบการทำงานในหัวข้อนี้ โดยจะส่งค่าของไดเร็กทอรีที่เก็บ<br />

รูปภาพไปยังแอคทิวิตี้ ListFiles ซึ่งจะแสดงไฟล์ทั้งหมดภายในไดเร็กทอรี และส่งค่าของไฟล์ที่ผู้ใช้<br />

งานเลือกไว้<br />

รูปภาพที่ถูกเลือกก็จะถูกอ่านเข้าสู่หน่วยความจำ ถ้ารูปภาพมีขนาดใหญ่มาก เราก็จะเลือกให้<br />

อ่านแค่บางส่วนเข้าสู่หน่วยความจำแทนด้วยการใช้คำสั่งใน onActivityResult ดังนี้<br />

BitmapFactory.Options options = new BitmapFactory.Options();<br />

options.inSampleSize = 4;<br />

Bitmap ImageToChange= BitmapFactory.decodeFile(tmp, options);<br />

ค่าของ inSampleSize นี้สร้างรูปภาพที่มีขนาดเล็กกว่ารูปภาพต้นฉบับ 4 เท่าเมื่อวัดจากขนาด<br />

ของจำนวนพิกเซลในแต่ละด้าน ซึ่งเราสามารถปรับเปลี่ยนค่านี้ได้ตามต้องการเพื่อให้สัมพันธ์กับขนาด<br />

ภาพต้นฉบับ

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!