سلام
چطور میتونم در Tc تحت داس یک عکس 16 بیتی رو نمایش بدم؟!
ممنون
Printable View
سلام
چطور میتونم در Tc تحت داس یک عکس 16 بیتی رو نمایش بدم؟!
ممنون
سلام دوست من یه یه چیزی دارم می خواهی برات بفرستم
سلامنقل قول:
سلام دوست من یه یه چیزی دارم می خواهی برات بفرستم
ممنون میشم.
سلام.
در VESA mode میتونید اینکار رو انجام بدید.
که به طور ساده گسترش یافته ی SVGA و XVGA هست (referesh rate -> 70Hz )
از Win95 به بعد از VESA پشتیبانی میشه. (ٌWin95 DDK)
VESA -->> video electronic standards association
اگه مشکلی پیش اومد اطلاع بدین.
خیلی ممنون someone جان
فقط اگه میشه یه کم در مورد نحوه نمایش عکس توضیح بده یا یه Sample ساده بزار.
ممنون
دوباره سلام.
یادم رفت سوالی رو از شما بپرسم.
تا حالا یک تصویر 8bits ( یا با Bit Depth کمتر ) رو تحت DOS نمایش دادید؟
البته منظورم درمورد Bitmap هست.
ضمنا تصویر مورد نظرتون از چه Type ی هست؟ (bmp,jpg,gif......)
ممنون.
سلام دوست عزیز
نه ! در این مورد تجربه ای ندارم.نقل قول:
یادم رفت سوالی رو از شما بپرسم.
تا حالا یک تصویر 8bits ( یا با Bit Depth کمتر ) رو تحت DOS نمایش دادید؟
BMP و یا JPGنقل قول:
ضمنا تصویر مورد نظرتون از چه Type ی هست؟ (bmp,jpg,gif......)
خیلی ممنون
دوباره سلام.
یه نمونه کد براتون گذاشتم که bitmap های 8bit ی رو نمایش میده.
البته bitmap ها باید بدون compression باشند.(RLE)
روش کار به همین صورت هست.
میتونید از initgraph و putpixel هم استفاده کنید. (از وقفه در این برنامه استفاده شده )
فقط در مورد استفاده از تابع fskip باید بگم که برای رسیدن به offset مورد نظر در bitmap ازین تابع استفاده شده.
میتونید از fseek هم استفاده کنید. مثلا header یک فایل bitmap در offset 0 به اندازه ی 2bytes شامل حرفهای
'B' و 'M' هست و یا در offset 2 به طول 4bytes اندازه ی فایل bitmap مورد نظر هست.(مربوط به bitmap file header )
در offset 18 (مربوط به bitmap information header هست) به طول 4bytes اندازه ی عرض تصویر هست و
به همین ترتیب...
در مورد تصاویر با bit depth بیشتر نمیشه از VGA استفاده کرد. XVGA ویا VESA از این مد پشتیبانی میکنن.
comprssion تصاویر JPEG پیچیدگی زیادی داره و نوشتن برنامه ای تحت DOS بتونه این تصاویر رو نمایش
بده خیلی مشکل هست. (حتی درwindows مگه با #C یا MFC که کلاس های لازم رو برای اینکار داره.)
اگه براتون اهمیت زیادی نداره اول تصویر رو به Bitmap تبدلی کنید و بعد اون رو نمایش
بدید. در مورد تصاویر 16bits ی هم سعی میکنم یه نمونه کد برتون بذارم.
در هر کدوم از تصاویر با bit Depth های 1 - 4 - 8 - 16- 24 روش نمایش مقداری تفاوت داره البته در برنامه های تحت
DOS که اگه خواستید براتون نمونه اش رو بذارم.
اگه مشکلی پیش اومد اطلاع بدید.کد:#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <mem.h>
#define VIDEO_INT 0x10 // the BIOS video interrupt.
#define SET_MODE 0x00 // BIOS func to set the video mode.
#define VGA_256_COLOR_MODE 0x13 // use to set 256-color mode.
#define TEXT_MODE 0x03 // use to set 80x25 text mode.
#define SCREEN_WIDTH 320 // width in pixels of mode 0x13
#define SCREEN_HEIGHT 200 // height in pixels of mode 0x13
#define NUM_COLORS 256 // number of colors in mode 0x13
typedef unsigned char byte;
typedef unsigned short word;
typedef unsigned long dword;
byte *VGA=(byte *)0xA0000000L; // this points to video memory
typedef struct tagBITMAP
{
word width;
word height;
byte *data;
} BITMAP;
void fskip(FILE *fp, int num_bytes)
{
int i;
for (i=0; i<num_bytes; i++)
fgetc(fp);
}
void set_mode(byte mode)
{
union REGS regs;
regs.h.ah = SET_MODE;
regs.h.al = mode;
int86(VIDEO_INT, ®s, ®s);
}
void load_bmp(char *file,BITMAP *b)
{
FILE *fp;
long index;
word num_colors;
int x;
if ((fp = fopen(file,"rb")) == NULL)
{
printf("Error opening file %s.\n",file);
exit(1);
}
if (fgetc(fp)!='B' || fgetc(fp)!='M')
{
fclose(fp);
printf("%s is not a bitmap file.\n",file);
exit(1);
}
fskip(fp,16);
fread(&b->width, sizeof(word), 1, fp);
fskip(fp,2);
fread(&b->height,sizeof(word), 1, fp);
fskip(fp,22);
fread(&num_colors,sizeof(word), 1, fp);
fskip(fp,6);
if (num_colors==0)
num_colors=256;
if ((b->data = (byte *) malloc((word)(b->width*b->height))) == NULL)
{
fclose(fp);
printf("Error allocating memory for file %s.\n",file);
exit(1);
}
fskip(fp,num_colors*4);
// read the bitmap
for(index=(b->height-1)*b->width;index>=0;index-=b->width)
for(x=0;x<b->width;x++)
b->data[(word)index+x]=(byte)fgetc(fp);
fclose(fp);
}
void draw_bitmap(BITMAP *bmp,int x,int y)
{
int j;
word screen_offset = (y<<8)+(y<<6)+x;
word bitmap_offset = 0;
for(j=0;j<bmp->height;j++)
{
memcpy(&VGA[screen_offset],&bmp->data[bitmap_offset],bmp->width);
bitmap_offset+=bmp->width;
screen_offset+=SCREEN_WIDTH;
}
}
void main()
{
int i,x,y;
BITMAP bmp;
load_bmp("test.bmp",&bmp);
set_mode(VGA_256_COLOR_MODE);
for(y=0;y<=bmp.height;y++)
for(x=0;x<=bmp.width;x++)
draw_bitmap(&bmp,x,y);
getch();
free(bmp.data);
set_mode(TEXT_MODE);
return;
}
ممنون.
خیلی ممنون
امتحان می کنم و اگه مشکلی بود مطرح میکنم.
کد خیلی جالبی بود !
بازم ممنون دوست عزیز