เก็บรูปภาพใน struct ทำได้อย่างไร จัดทำโดย : langjuko พิมพ์

เก็บรูปภาพใน struct ทำได้อย่างไร

บทความนี้เขียนขึ้นจากตอนเขียนเกม ถ้าเราจะเก็บรูปภาพเอาไว้ในตัวแปรแบบ struct ล่ะ ถ้าใช้ Visual C++ เขียนจะทำอย่างไร ที่ว่าใช้ VC ก็เพราะว่าไม่ได้ลองกับ Turbo C แต่คิดว่าแนวคิดจะใกล้เคยงกันครับ..

ปกติแล้ว การ open file ในภาษา C นี่มันสามารถเปิดไฟล์แบบ binary ได้ ไม่จำเป็นจะต้องอ่านมาแบบ struct ก็ทำได้ อย่างไฟล์รูปนี่ ถ้าเราอ่านมาเพื่อที่จะแสดงมันในโปรแกรมอย่างเช่น acdsee อย่าง jpg ที่จะต้องทำ cosine transform ทำ decode ตามวีธีการของมัน เพราะว่ามันถูก compress อยู่ แต่ถ้าเราไม่อ่านตามสูตร เราอ่านมาเป็น Byte แล้วเก็บไว้ใน struct เลยได้มั้ย อันนี้ได้.. จริง ๆ ไม่ต้อง struct หรอก แต่ที่ใช้ struct ก็เพราะว่าเราจะได้เก็บจำนวนขนาดมันด้วยไงครับ เวลาไปก็ไปเป็นก้อน ๆ เป็นโครงสร้างเลย.ง

เรามาดูตัวอย่างกันดีกว่า ลองดู struct ต่อไปนี้

struct IMAGEFILE
{
int size;
char data[52100];
};

จากนั้น เขียนโหลดภาพเข้ามาด้วยโค้ดนี้

IMAGEFILE im;
im.size=2327;

FILE *fp;
fp=fopen("test.jpg","rb");
fread(im.data,im.size,1,fp);
fclose(fp);

ตอนนี้ im ก็จะเก็บทั้งขนาดที่เรากำหนดลงไป แต่ถ้าแบบนี้ เราจะต้องกำหนดมันทุกครั้ง ดังนั้น เราจะกำหนดขนาดด้วยวิธีใหม่ คือ ใช้ fseek และ ftell ช่วย.. คือ เลื่อน File Pointer ไปที่ท้ายไฟล์ จากนั้นใช้ ftell บอกมาว่าตำแหน่งนั้นน่ะ byte อะไร เท่านี้ก็ได้ขนาดไฟล์แล้วครับ แบบนี้

FILE *fp;
fp=fopen("test.jpg","rb");

fseek(fp,0,SEEK_END);
im.size=ftell(fp);
fseek(fp,0,SEEK_SET);

fread(im.data,im.size,1,fp);
fclose(fp);

ตอนนี้ไฟล์ test.jpg ทั้งไฟล์ถูกเก็บอยู่ใน im แล้วครับ เราจะ copy, สำเนาหรือ ส่งผ่าน network ทั้ง struct นี้มันก็จะไปทั้งไฟล์เลยครับ พอถึงปลายทางอยากจะเอามาแสดงผลก็ให้ save เป็นไฟล์ .jpg ด้วยขนาดที่ระบุเอาไว้ใน im.size โดย save แบบ binary นะครับ ดังนี้

fp=fopen("a.jpg","wb");
fwrite(im.data,im.size,1,fp);
fclose(fp);

คราวนี้ไฟล์ a.jpg ก็จะได้ภาพเดียวกันกับ test.jpg เลยครับ..

อันนี้เป็นเทคนิคการบันทึกรูปหรือจริง ๆ แล้วก็ใช้กับไฟล์แบบอื่น ๆ ได้ ถ้ารูป jpg หรือ gif ทำได้ ไฟล์ .exe ก็น่าจะทำได้เหมือนกัน.. ลองดูนะครับ

คุณอาจสนใจ
คำถามยอดฮิตเร่งสปีดบรอดแบนด์
เว็บไทยดีดี (14,744 - 22 ก.ย. 50)
WinRAR มากกว่าคำว่า..บีบอัดข้อมูล
เว็บไทยดีดี (17,884 - 08 ก.ย. 50)
ลืมรหัสผ่านที่ตั้งไว้ใน Content Advisor จะแก้อย่างไร XP
เว็บไทยดีดี (15,593 - 29 ก.ย. 50)
การใช้งาน String Class (ตอนที่ 1)
Mr.POP (54,323 - 05 พ.ย. 49)
วางแผนรับมือจากการโดนโจมตีเครื่องในเน็ตเวิร์ก
เว็บไทยดีดี (14,977 - 29 ก.ย. 50)
การทำ ให้ Button นับ ถอยหลัง
first (37,747 - 13 พ.ย. 51)
การใช้คำสั่งวนลูป do..while
Mr.GuruZ (27,345 - 03 มิ.ย. 49)
การเลือกข้อมูลให้เหมาะสมกับการใช้งาน
Mr.N (24,868 - 30 เม.ย. 50)