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

คุณอาจสนใจ
เพิ่มความเร็ว Vista ด้วย Flash Drive คุ้มค่าหรือไม่
ไอ้จุก (18,221 - 15 มี.ค. 51)
ครอปส่วนที่ต้องการบนรูปภาพด้วย Photoshop 7
Ching Ching (133,394 - 04 เม.ย. 51)
การใช้ javascript เพื่อเช็คค่าว่าง
Tung (45,995 - 22 พ.ย. 50)
สร้างกลีบดอกไม้ให้ซ้อนกัน
langjuko (50,925 - 20 ต.ค. 51)
วิธีกำจัด virus adober.exe ที่แฝงมากับ Handy drive
เว็บไทยดีดี (20,948 - 15 ก.ย. 50)
เทคนิคการเก็บโค้ด PHP ไว้ใน Dream MX
Mr.GuruZ (33,954 - 04 มิ.ย. 49)
การทำข้อความแบบมีเวทมนต์
webthaidd (147,489 - 19 เม.ย. 51)
ลง Windows update แล้ว OE เดี้ยง
เว็บไทยดีดี (14,246 - 29 ก.ย. 50)