PDA

View Full Version : نحوه نمایش یک فایل bmpدر c++چگونه است؟



hassan_kahrizy
شنبه 21 آبان 1384, 17:07 عصر
بسمه تعالی
با سلام
من می خواهم با c++ یک برنامه بنویسم که یک فایل bmpرو نشون بده
اگر می تونید راهنمایی کنید ممنون می شم
با تشکر

mzjahromi
یک شنبه 22 آبان 1384, 10:54 صبح
ببین فایل BMP یه هدر داره که وضوح و تعداد رنگ رو مشخص می کنه که من الان فرمت هدرش یادم نیست ولی مقلا اگر 256 رنگ باشه ، بعد از هدر هر بایت نشون دهنده یک پیکسل هست. و با توجه به وضوح تصویر به راحتی می تونی ترسیمش کنی. حالا برای پیدا کردن فرمت هدر می تونی با مقایسه چند نمونه تصویر مختلف این کار رو انجام بدی ولی در این زمینه کتاب هم هست تو اینترنت جستجو کنی راحت می تونی گیر بیاری

hassan_kahrizy
یک شنبه 22 آبان 1384, 11:43 صبح
بسمه تعالی
با سلام
از هیدر فایل باید چه پارامتر هایی رو دونست
و در ضمن آیا پیکسل ها به طور مرتب داخل فایل هست؟
لطفا یک مقدار بیشتر توضیح بدبد
با تشکر

mzjahromi
یک شنبه 22 آبان 1384, 12:50 عصر
از هدر فایل لازم داری Resolution و Color Depth رو بدونی بعدش دیگه کاری نداره بهتره اول با عکسهای 256 رنگ شروع کنی آخه هر بایت نمایانگر شماره رنگ یک پیکسل هست. بعد پیکسلها به صورت ردیف به ردیف پشت سر هم هستن. فقط تنها چیزی که باید حواست باشه اینه که اگه از اول شروع کنی و از سمت چپ مانیتور، اونوقت عکست آئینه میشه پس باید از سمت راست مانیتور شروع به رسم کنی(البته اول همون حالت طبیعی رو رسم کن بعد آئینه کردنش کاری نداره

amir_civil
یک شنبه 22 آبان 1384, 15:55 عصر
سلام دوست عزیز
امیدوارم این کد کمکت بکنه :لبخندساده
[Code]

#include <windows.h>
#include <fstream.h>

char szAppName [] = "BMPLoad";

LRESULT CALLBACK WindowProc (HWND, UINT, WPARAM, LPARAM);

// **********
// class CRaster
// - Generic class for BMP raster images.
class CRaster {
public:
int Width,Height; // Dimensions
int BPP; // Bits Per Pixel.
char * Raster; // Bits of the Image.
RGBQUAD * Palette; // RGB Palette for the image.
int BytesPerRow; // Row Width (in bytes).
BITMAPINFO * pbmi; // BITMAPINFO structure

// Member functions (defined later):
int LoadBMP (char * szFile);
int GDIPaint (HDC hdc,int x,int y);
};

// **********
// Windows Main Function.
// - Here starts our demo program
int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
HWND hwnd;
MSG msg;

WNDCLASS wc;
wc.style = CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = szAppName;

RegisterClass (&wc);

hwnd = CreateWindow (szAppName,"BMP Load",WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDE FAULT,
0,0,hInstance,0);

ShowWindow (hwnd,nCmdShow);
UpdateWindow (hwnd);

while (GetMessage(&msg,0,0,0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}

return msg.wParam;
}

// **********
// Main Window Procedure.
// - Processes Window Messages
LRESULT CALLBACK WindowProc
(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static CRaster bmp;
HDC hdc;
PAINTSTRUCT ps;

switch (message)
{
case WM_CREATE:
bmp.LoadBMP ("example.bmp");
return 0;
case WM_PAINT:
hdc=BeginPaint (hwnd,&ps);
bmp.GDIPaint (hdc,10,10);
EndPaint (hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
}
return DefWindowProc (hwnd,message,wParam,lParam);
}

// **********
// CRaster::LoadBMPFile (FileName);
// - loads a BMP file into a CRaster object
// * supports non-RLE-compressed files of 1, 2, 4, 8 & 24 bits-per-pixel
int CRaster::LoadBMP (char * szFile)
{
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;

// Open file.
ifstream bmpfile (szFile , ios::in | ios::binary);
if (! bmpfile.is_open()) return 1; // Error opening file

// Load bitmap fileheader & infoheader
bmpfile.read ((char*)&bmfh,sizeof (BITMAPFILEHEADER));
bmpfile.read ((char*)&bmih,sizeof (BITMAPINFOHEADER));

// Check filetype signature
if (bmfh.bfType!='MB') return 2; // File is not BMP

// Assign some short variables:
BPP=bmih.biBitCount;
Width=bmih.biWidth;
Height= (bmih.biHeight>0) ? bmih.biHeight : -bmih.biHeight; // absoulte value
BytesPerRow = Width * BPP / 8;
BytesPerRow += (4-BytesPerRow%4) % 4; // int alignment

// If BPP aren't 24, load Palette:
if (BPP==24) pbmi=(BITMAPINFO*)new char [sizeof(BITMAPINFO)];
else
{
pbmi=(BITMAPINFO*) new char[sizeof(BITMAPINFOHEADER)+(1<<BPP)*sizeof(RGBQUAD)];
Palette=(RGBQUAD*)((char*)pbmi+sizeof(BITMAPINFOHE ADER));
bmpfile.read ((char*)Palette,sizeof (RGBQUAD) * (1<<BPP));
}
pbmi->bmiHeader=bmih;

// Load Raster
bmpfile.seekg (bmfh.bfOffBits,ios::beg);

Raster= new char[BytesPerRow*Height];

// (if height is positive the bmp is bottom-up, read it reversed)
if (bmih.biHeight>0)
for (int n=Height-1;n>=0;n--)
bmpfile.read (Raster+BytesPerRow*n,BytesPerRow);
else
bmpfile.read (Raster,BytesPerRow*Height);

// so, we always have a up-bottom raster (that is negative height for windows):
pbmi->bmiHeader.biHeight=-Height;

bmpfile.close();

return 0;
}

// **********
// CRaster::GDIPaint (hdc,x,y);
// * Paints Raster to a Windows DC.
int CRaster::GDIPaint (HDC hdc,int x=0,int y=0)
{
// Paint the image to the device.
return SetDIBitsToDevice (hdc,x,y,Width,Height,0,0,
0,Height,(LPVOID)Raster,pbmi,0);
}
[Code/]

mzjahromi
یک شنبه 22 آبان 1384, 16:03 عصر
دوست عزیز برای نوشتن کد از


(code)
(/Code)

استفاده کن البته بجای ( بگذار [

hassan_kahrizy
دوشنبه 23 آبان 1384, 05:14 صبح
بسمه تعالی
با سلام
این اطلاعات به چه صورت در فایل ذخیره شده اند و برای تبدیل آنها باید چه کنم
در ضمن کد هر رنگ یک بایت است و یا بخشی از آن
با تشکر از شما mzjahrom
از شما هم متشکرم amir_civil ولی من باید تحت داس بنویسم

mzjahromi
دوشنبه 23 آبان 1384, 08:20 صبح
ببینید تبدیلی نمی خواهد. یک بایت رو می خونی و یک پیکسل رو با همون رنگ مینویسی(البته تو 256 رنگ) بعد میری سراغ بایت بعد. اگر فقط میخوای 256 رنگ کار کنی کاری به در هم نداشته باش فقط کافیه بدونی اطلاعات رنگها از کجا شروع شده است همین بقیه اش یه برنامه 10 خطی بیشتر نیست

aakh1361
سه شنبه 24 آبان 1384, 00:06 صبح
اگر فقط میخوای 256 رنگ کار کنی کاری به در هم نداشته باش فقط کافیه بدونی اطلاعات رنگها از کجا شروع شده است همین بقیه اش یه برنامه 10 خطی بیشتر نیست


اصلش همون 10 خطه !!!
:قهقهه: :قهقهه: :بامزه:

mzjahromi
سه شنبه 24 آبان 1384, 08:28 صبح
بابا اون ده خط که دیگه چیزی نیت میخواد یه بایت رو از فایل بخونی و یک پیکسل رو رنگ کنی آخر خط که رسیدی میری خط بعد.

aakh1361
سه شنبه 24 آبان 1384, 23:02 عصر
بابا اون ده خط که دیگه چیزی نیت میخواد یه بایت رو از فایل بخونی و یک پیکسل رو رنگ کنی آخر خط که رسیدی میری خط بعد.

خوب شما که بلدی سورسش رو بذار که دوستمون ازش استفاده کنه
http://asefsoft.com/qsimages/39.gif http://asefsoft.com/qsimages/38.gif http://asefsoft.com/qsimages/18.gif

hassan_kahrizy
چهارشنبه 25 آبان 1384, 05:38 صبح
بسمه تعالی
با سلام
حالا از کجا بفهمم چند رنگه که در صورتی که بیشتر بود پیغام بدم
با تشکر

mzjahromi
چهارشنبه 25 آبان 1384, 08:50 صبح
اول اون ده خط به شبه کد اینه


go to the first data byte of file after header
for j=0 to height-1 do
for i=width-1 downto 0 do
{
ch1:=read a byte from file
set the pixel at position i and j to color ch1;
}

تعداد رنگهاش هم باید از هدر استخراج کنی. همچنین Resolution

mzjahromi
چهارشنبه 25 آبان 1384, 08:53 صبح
ببین می تونی از این چیزی بفهمی. ظاهرا سورس هم هست
http://astronomy.swin.edu.au/~pbourke/dataformats/bmp/

mzjahromi
چهارشنبه 25 آبان 1384, 08:54 صبح
اینهم هست
http://atlc.sourceforge.net/bmp.html

aakh1361
چهارشنبه 25 آبان 1384, 14:48 عصر
این درسته
http://asefsoft.com/qsimages/18.gif http://asefsoft.com/qsimages/18.gif

hassan_kahrizy
پنج شنبه 26 آبان 1384, 07:22 صبح
بسمه تعالی
با سلام
از لطف شما متشکرم

qqaliqq
پنج شنبه 24 فروردین 1385, 17:22 عصر
ممنونم دوست عزیز

eshaghrahimy
سه شنبه 26 اردیبهشت 1385, 04:08 صبح
مرسی بچه ها

aidivandi
چهارشنبه 22 آذر 1385, 10:38 صبح
در مورد فایلهای تصویری با فرمت pgm به چه صورتی باید عمل کرد(فایلهایی که به صورت خاکستری هستند)