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

คุณอาจสนใจ
แนะนำการใช้งาน Filter -> Artistic
first (53,778 - 11 ก.พ. 51)
การทำ Expaning_text
Black-Hawk (123,786 - 22 ก.พ. 51)
การย่อ-ขยายเอกสาร
นายนุก (20,644 - 22 มี.ค. 51)
การแทรก และลบ Column ใน Query
คุณอ้อม (19,473 - 30 เม.ย. 50)
การหาค่าสูงสุด (MAX) จากฐานข้อมูล MySQL
Mr.GuruZ (50,246 - 02 ต.ค. 49)
เนรมิตรน้ำค้างด้วย Photoshop
พุงโต (88,814 - 04 เม.ย. 51)
การใช้งาน Vertical Type Tool
Mr.GuruZ (34,700 - 27 มิ.ย. 49)
เทคนิคการซ้อนเงาแบบ Pathfinder
ล่องลอย (43,227 - 04 ก.ย. 49)