Who's Online

มี 68 ผู้มาเยือน และ ไม่มีสมาชิกออนไลน์ ออนไลน์

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

ดาวไม่ได้ใช้งานดาวไม่ได้ใช้งานดาวไม่ได้ใช้งานดาวไม่ได้ใช้งานดาวไม่ได้ใช้งาน
 

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

About I-Comz

bcomz.com เป็นส่วนหนึ่งของงานซ่อมคอมพิวเตอร์นอกสถานที่ บางกะปิ รามคำแหง ซึ่งมีประสบการณ์การซ่อมและการค้าขาย มากกว่า 10 ปี โดยมอบประสบการณ์การช้อปปิ้งและช่องทางการขายปลีกที่สะดวกสบายสำหรับผู้บริโภคและมอบแพลตฟอร์มสำหรับผู้ค้าให้สามารถเข้าถึงฐานลูกค้าที่ใหญ่ที่สุดในเอเชียตะวันออกเฉียงใต้ได้อย่างง่ายดาย

Counter

เนื้อหาที่เปิดอ่าน
116545
©2024 ซ่อมคอมพิวเตอร์นอกสถานที่ All Rights Reserved. Designed By Becomz

Search