ورود

View Full Version : درمورد گرافیک



mehdieebadie
سه شنبه 15 آبان 1386, 15:08 عصر
با سلام
سوال:آیا تابعی برای اینکه یک تصویررا در یک فایل دودوئی ذخیره کنیم هست؟

Sometimes
جمعه 18 آبان 1386, 01:40 صبح
سلام.
همه فایلها در ویندوز باینری هستن.
به عبارت دیگه خود فایل تصویر شما باینری هست.
شما دنبال چه قالبی هستین؟ (الگوی خاصی مد نظرتون هست؟)

mehdieebadie
جمعه 18 آبان 1386, 23:57 عصر
با تشکر از توجه شما
راستش من یه پروژه رو دنبال میکنم که مربوط به درس گرافیک در دوره کاردانی میخواستم بدونم چه جوری میتونم به کدهای باینری تصویرم دسترسی داشته باشم که بعد بتونم با
دستکاری کدهای باینری اندازه تصویر رو عوض کنم(کوچک و بزرگ)

EMANOEL
شنبه 19 آبان 1386, 21:00 عصر
نه چنین تابعی نداریم تو اینترنت در مورد پرتکل فایلهای BMP جستجو کن

Nima_NF
شنبه 19 آبان 1386, 21:50 عصر
شما اول باید مشخص کنید کدام فرمت را می خواهید باز و سپس تغییرات انجام دهید ، بعد باید به سایت شرکت سازنده یا هر مرجه دیگری مراجعه کنید تا از نحوه ذخیره سازی و فشرده سازی آن فرمت آگاه شوید.
مثلا یک فایل BMP از ابتدای آن تا انتهای فایل شامل موارد زیر است.

file header
information header
color table
pixel bits


در ویندوز و از طریق GDI به این شکل عمل می کنیم:
ابتدا فایل را باز می کنیم (یعنی همان خواندن دودویی)و اشاره گری به struct آن می سازیم. (در سایر فرمت ها باید از struct ای استفاده کنید که شرکت سازنده معرفی کرده باشد)


BITMAPFILEHEADER * pbmfh = LoadImageFunction (szFileName) ;

که تابع loadimage فوق را باید خودتان به ترتیب زیر تعریف کنید:
-ابتدا باز کردن فایل با CreateFile یا هر تابع در زبان های دیگر
- پیدا کردن اندازه فایل و اختصاص حافظه برای همان struct شما یعنی pbmfh
- خواندن فایل و ریختن در حافظه فوق ReadFile

بعد از طریق کد های زیر اشاره گری می سازید به دو بخش information برای هر نوع جزئیاتی و bit ها که شامل رنگ ها هستند .این یعنی اینکه مثلا pmbi به اندازه pbmfh بایت به علاوه یکی بره جلو و آن قسمت در فایل (که در حافظه لود شده) محل خواندن اطلاعات است.

pbmi = (BITMAPINFO *) (pbmfh + 1) ;
pBits = (BYTE *) pbmfh + pbmfh->bfOffBits ;

و مثلا برای خواندن طول و عرض عکس از همان struct تعریف شده استفاده می کنیم.



cxDib = ((BITMAPCOREHEADER *) pbmi)->bcWidth ;
cyDib = ((BITMAPCOREHEADER *) pbmi)->bcHeight ;




حالا هر چه را که تغییر دادید (که در حافظه انجام شده) دوباره باید از طریق ساخت فایل دیگری آنها را save کنید.