|
|
请教:
/////////////////////////////////////////////
//读取BMP文件
/////////////////////////////////////////////
int LoadBMPFile(BMP_FILE bitmap, char *filename)
{
int file_handle; //文件句柄
UCHAR *temp_buffer = NULL;
OFSTRUCT file_data;
//打开文件
if ((file_handle = OpenFile(filename,&file_data,OF_READ))==-1)
{
MessageBox(NULL,TEXT("Open bmp File error!"),
TEXT("Wrong!"),MB_OK);
return(0);
}
//读取文件头
_lread(file_handle, &bitmap->bitmapfileheader,sizeof(BITMAPFILEHEADER));
//是否BMP图形格式
if (bitmap->bitmapfileheader.bfType!=BITMAP_ID)
{
//关闭文件
_lclose(file_handle);
MessageBox(NULL,TEXT("bmp File ID error!"),
TEXT("Wrong!"),MB_OK);
return(0);
}
//读取文件头
_lread(file_handle, &bitmap->bitmapinfoheader,sizeof(BITMAPINFOHEADER));
//读数据
_lseek(file_handle,-(int)(bitmap->bitmapinfoheader.biSizeImage),SEEK_END);
//将24位转为16位
if (bitmap->bitmapinfoheader.biBitCount==16 || bitmap->bitmapinfoheader.biBitCount==24)
{
//删除已有信息
if (bitmap->buffer)
free(bitmap->buffer);
//分配空间
if (!(bitmap->buffer = (UCHAR *)malloc(bitmap->bitmapinfoheader.biSizeImage)))
{
//关闭文件
_lclose(file_handle);
MessageBox(NULL,TEXT("bmp File buffer error!"),
TEXT("Wrong!"),MB_OK);
return(0);
}
//读取
_lread(file_handle,bitmap->buffer,bitmap->bitmapinfoheader.biSizeImage);
}
else
{
//出错
MessageBox(NULL,TEXT("bmp File read error!"),
TEXT("Wrong!"),MB_OK);
return(0);
}
//关闭文件
_lclose(file_handle);
//翻转图形
FlipBMPFile(bitmap->buffer,
bitmap->bitmapinfoheader.biWidth*(bitmap->bitmapinfoheader.biBitCount/8),
bitmap->bitmapinfoheader.biHeight);
return(1);
}
/////////////////////////////////////////////
//翻转BMP文件
/////////////////////////////////////////////
int FlipBMPFile(UCHAR *image, int bytes_per_line, int height)
{
UCHAR *buffer;
int index;
// 分配空间
if (!(buffer = (UCHAR *)malloc(bytes_per_line*height)))
{
MessageBox(NULL,TEXT("flip bmp File buffer error!"),
TEXT("Wrong!"),MB_OK);
return(0);
}
//翻转
memcpy(buffer,image,bytes_per_line*height);
for (index=0; index < height; index++)
memcpy(&image[((height-1) - index)*bytes_per_line],
&buffer[index*bytes_per_line], bytes_per_line);
free(buffer);
return(1);
}
请教:
问题1:
为什么要翻转啊?
问题2:
翻转到底是什么意思?
翻转的是什么东西?
问题3:
if (!(buffer = (UCHAR *)malloc(bytes_per_line*height)))
这个有语句有什么功能,为什么要用呢?
问题4:
memcpy(buffer,image,bytes_per_line*height);
for (index=0; index < height; index++)
memcpy(&image[((height-1) - index)*bytes_per_line],
&buffer[index*bytes_per_line], bytes_per_line);
这些语句怎么能实现翻转啊?
问题5:
((height-1) - index)*bytes_per_line
这个语句得到的是什么?
index*bytes_per_line
这个语句得到的是什么?
谢谢!
[em17] [em20] [em3] [em21] |
|