เก็บรูปภาพใน 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 ก็น่าจะทำได้เหมือนกัน.. ลองดูนะครับ

คุณอาจสนใจ
การตั้งพาสเวิร์ด (Password) ให้กับเอกสารของเรา
nutthapon (40,447 - 02 ก.ค. 49)
การทำ Poll ตอนที่ 4 (การสร้าง Set Active ให้กับหัวข้อที่จะโหวด)
Mr.GuruZ (33,885 - 03 มิ.ย. 49)
แต่งหน้าให้ดู over กันเถอะ
langjuko (275,206 - 02 ก.ย. 51)
การสร้าง Folder ย่อยใน Site
Mr.GuruZ (22,777 - 26 พ.ย. 50)
แสดงหรือซ่อนปุ่มบนแุถบเครื่องมือ
นายนุก (20,877 - 06 มี.ค. 51)
การแทรกเลขหน้าอย่างรวดเร็ว
สายลม (23,032 - 13 ม.ค. 50)
การใช้ super
Mr.POP (44,337 - 05 พ.ย. 49)
Rss คืออะไร?
Zerohate (35,860 - 28 ม.ค. 51)