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 />
ภาพต้นฉบับ