怎么样在c语言中显示bmp图片,我要完整正确的程序,急!

怎么样在c语言中显示bmp图片,我要完整正确的程序,急!,第1张

lz  你好

c语言要显示bmp位图需要使用win32的api , 具体如下:

BOOL BitBlt(

  HDC hdcDest, // 位图显示目标设备环境中

  int nXDest,  // 位图显示在客户区的x坐标

  int nYDest,  // 位图显示在客户区的y坐标

  int nWidth,  // 位图显示的宽度

  int nHeight, // 位图显示的长度

  HDC hdcSrc,  // 源设备环境(包含需要显示的bmp位图)

  int nXSrc,   // 在当前位图中显示的开始逗慧中x位置

  int nYSrc,   // 在当前位图中显示的开始y位置

  DWORD dwRop  山山// 映射模式

)

以下是源代码:

//显示bmp位图

#include<windows.h>

#include"resource.h"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)

void DrawBrick() 

int WINAPI WinMain(HINSTANCE hInstance,

   HINSTANCE hPrevInstance,

                   PSTR szCmdLine,

   int iCmdShow)

{

static TCHAR szAppName[] = TEXT("Bmp")

HWND hwnd

MSG msg

WNDCLASS wndclass

wndclass.style = CS_HREDRAW | CS_VREDRAW

wndclass.lpfnWndProc = WndProc

wndclass.cbClsExtra = 0

wndclass.cbWndExtra = 0

wndclass.hInstance = hInstance

wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION)

wndclass.hCursor = LoadCursor(NULL, IDC_ARROW)

wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH)

wndclass.lpszMenuName = NULL

wndclass.lpszClassName = szAppName

if(!RegisterClass(&wndclass))

{

MessageBox(NULL, TEXT("This program requires Windows NT!"),

szAppName, MB_ICONERROR)

return 0

}

hwnd = CreateWindow(szAppName,

TEXT("Bmp Demo"),

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

754,

566,

NULL,

NULL,

hInstance,

NULL)

ShowWindow(hwnd, iCmdShow)

UpdateWindow(hwnd)

while(GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg)

DispatchMessage(&msg)

}

return msg.wParam

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

static HBITMAP hBitmap //位图句柄  标示位图

static int cxBitmap, cyBitmap //位图的长宽

BITMAP bitmap

HDC hdc, hdcMem

HINSTANCE hInstance

PAINTSTRUCT ps

switch(message)

{

case WM_CREATE:

hInstance = ((LPCREATESTRUCT)lParam)->hInstance //获取窗口的实例句柄

hBitmap = 碧橘LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1)) //将位图加载到内存中

GetObject(hBitmap, sizeof(BITMAP), &bitmap)

cxBitmap = bitmap.bmWidth//获取位图的长

cyBitmap = bitmap.bmHeight//获取位图的宽

return 0 

case WM_PAINT:

hdc = BeginPaint(hwnd, &ps)

hdcMem = CreateCompatibleDC(hdc)//创建一个兼容于hdc设备环境描述表的hdcMem  主要是用于在内存中截图

SelectObject(hdcMem, hBitmap)   //将位图选到hdcMem中

BitBlt(hdc, -1, -1, cxBitmap, cyBitmap, hdcMem, 0, 0, SRCCOPY)//绘制bmp位图

DeleteDC(hdcMem)

EndPaint(hwnd, &ps)

return 0

case WM_DESTROY:

DeleteObject(hBitmap)

PostQuitMessage(0)

return 0

}

return DefWindowProc(hwnd, message, wParam, lParam)

}

程序运行效果:

希望能帮助你哈

ps:

附件是整个工程 , 用vs2008创建的项目 , 里面包含相应资源

#ifndef IMAGE_H

#define IMAGE_H

void image_info(FILE* file)

void image_save(FILE *file)

void image_gray()

void image_binarization()

void image_opposite()

void image_channel() //抽取RGB通道

void image_bright()//改变图像亮度

typedef struct BMP

{

//14字节

unsigned shortbfType //文件标识 2字节 必须为BM

unsigned int bfSize //文件大小 4字节

unsigned shortbfReserved1 //保留,每字节以"00"填写 2字节

unsigned shortbfReserved2 //同上 2字节

unsigned int bfOffBits //记录图像数据区的起始位置(图象数据相对于文件头字节的偏移量团春罩)。 4字节

//40字节

unsigned int biSize //表示本结构的大小 4字节

intbiWidth //位图的宽度 4字节

intbiHeight //位图的高度 4字节

unsigned short biPlanes //永远为1 , 2字节

unsigned short biBitCount //位图的位数 分为1 4 8 16 24 32 2字节

unsigned int biCompression //压缩说明 4字节

unsigned int biSizeImage //表示位图数据区域的大小以字节为单位 4字节

int biXPelsPerMeter //用象素/米表示的水平分辨率 4字节

int biYPelsPerMeter //用象素/米表示的垂直分辨率 4字节

unsigned int biClrUsed //位图使用的颜色索引数 4字节

unsigned int biClrImportant //对图象显示有重要影响的颜色索引的数目 4字节

} BMP

int line_byte

unsigned char *imagedata

extern BMP bmp

extern int line_byte

extern unsigned char *imagedata

#endif

//image_rw.c文件

#include<stdio.h>

#include<stdlib.h>

#include"image.h"

void image_info(FILE *file)

{

int times=3//输入文件名次森雹数。

char bmp_name[10] //文件名

printf("\nplease enter a file name for reading:")

do

{

if (times<3)

{

printf("\nplease enter a file name for reading again:")

}

fflush(stdin)

gets(bmp_name)

//printf("\塌闹n%s",bmp_name)

file=fopen(bmp_name,"rb+") //打开一个文件进行读写 *** 作。

--times

if (file==NULL)

{

printf("\nerror opening %s for reading! ",bmp_name)

}

else

{

break

}

}

while(times!=0)

if (times==0)

{

printf("\nsorry, shutdown!")

exit(1)

}

//读取图像信息

fseek(file,0L,0)//读取图像文件类型

fread(&bmp,sizeof(BMP),1,file)

printf("\n bmp tpye:%u",bmp.bfType)

printf("\n bmp size:%u",bmp.bfSize)

printf("\n bmp reserved1:%u",bmp.bfReserved1)

printf("\n bmp reserved2:%u",bmp.bfReserved2)

printf("\n bmp offBits: %u",bmp.bfOffBits)

printf("\n bmp bisize: %u",bmp.biSize)

printf("\n bmp biWidth: %d",bmp.biWidth)

printf("\n bmp biHeight: %d",bmp.biHeight)

printf("\n bmp biplans: %u",bmp.biPlanes)

printf("\n bmp biBitCount: %u",bmp.biBitCount)

printf("\n bmp biCompression: %u",bmp.biCompression)

printf("\n bmp biSizeImage: %u",bmp.biSizeImage)

printf("\n bmp biXPelsPerMeter: %d",bmp.biXPelsPerMeter)

printf("\n bmp biYPelsPerMeter: %d",bmp.biYPelsPerMeter)

printf("\n bmp biClrUsed: %u",bmp.biClrUsed)

printf("\n bmp biClrImportant: %u\n",bmp.biClrImportant)

line_byte=(bmp.biWidth*bmp.biBitCount/8+3)/4*4//获得图像数据每行的数据个数

//printf("dfsa%u",bmp.line_byte)

//bmp.imagedata=NULL

imagedata=(unsigned char*)malloc(bmp.biSizeImage)

fseek(file,(long)bmp.bfOffBits,0)

fread(imagedata,sizeof(unsigned char),bmp.biSizeImage,file)

fclose(file)

}

//保存图像

void image_save(FILE *file)

{

int times=3//输入文件名次数。

char bmp_name[10] //文件名

//int i //记录数据区个数

printf("\nplease enter a file name for writeing:")

do

{

if (times<3)

{

printf("\nplease enter a file name for writeing again:")

}

fflush(stdin)

gets(bmp_name)

printf("\n%s",bmp_name)

file=fopen(bmp_name,"wb+") //打开一个文件进行读写 *** 作。

--times

if (file==NULL)

{

printf("\nerror opening %s for writing",bmp_name)

}

else

{

break

}

}

while(times!=0)

if (times==0)

{

printf("\nsorry, shutdown!")

exit(1)

}

//写文件头

printf("\n%s",bmp_name)

fseek(file,0L,0)//图像文件类型

fwrite(&(bmp.bfType),sizeof(short),1,file)

printf("\n bmp tpye:%d",bmp.bfType)

fseek(file,2L,0)//图像文件大小

fwrite(&(bmp.bfSize),sizeof(int),1,file)

printf("\n bmp size:%d",bmp.bfSize)

fseek(file,6L,0)//图像文件保留字1

fwrite(&(bmp.bfReserved1),sizeof(short),1,file)

printf("\n bmp reserved1:%d",bmp.bfReserved1)

fseek(file,8L,0)//图像文件保留字2

fwrite(&(bmp.bfReserved2),sizeof(short),1,file)

printf("\n bmp reserved2:%d",bmp.bfReserved2)

fseek(file,10L,0)//数据区的偏移量

fwrite(&(bmp.bfOffBits),sizeof(short),1,file)

printf("\n bmp offBits: %d",bmp.bfOffBits)

fseek(file,14L,0)//文件头结构大小

fwrite(&(bmp.biSize),sizeof(int),1,file)

printf("\n bmp bisize: %d",bmp.biSize)

fseek(file,18L,0)//图像的宽度

fwrite(&(bmp.biWidth),sizeof(int),1,file)

printf("\n bmp biWidth: %d",bmp.biWidth)

fseek(file,22L,0)//图像的高度

fwrite(&(bmp.biHeight),sizeof(int),1,file)

printf("\n bmp biHeight: %d",bmp.biHeight)

fseek(file,24L,0)//图像的面数

fwrite(&(bmp.biPlanes),sizeof(short),1,file)

printf("\n bmp biplans: %d",bmp.biPlanes)

fseek(file,28L,0)//图像一个像素的字节数

fwrite(&(bmp.biBitCount),sizeof(short),1,file)

printf("\n bmp biBitCount: %d",bmp.biBitCount)

fseek(file,30L,0)//图像压缩信息

fwrite(&(bmp.biCompression),sizeof(short),1,file)

printf("\n bmp biCompression: %d",bmp.biCompression)

fseek(file,34L,0)//图像数据区的大小

fwrite(&(bmp.biSizeImage),sizeof(int),1,file)

printf("\n bmp biSizeImage: %d",bmp.biSizeImage)

fseek(file,38L,0)//水平分辨率

fwrite(&(bmp.biXPelsPerMeter),sizeof(int),1,file)

printf("\n bmp biXPelsPerMeter: %d",bmp.biXPelsPerMeter)

fseek(file,42L,0)//垂直分辨率

fwrite(&(bmp.biYPelsPerMeter),sizeof(int),1,file)

printf("\n bmp biYPelsPerMeter: %d",bmp.biYPelsPerMeter)

fseek(file,46L,0)//颜色索引数

fwrite(&(bmp.biClrUsed),sizeof(int),1,file)

printf("\n bmp biClrUsed: %d",bmp.biClrUsed)

fseek(file,50L,0)//重要颜色索引数

fwrite(&(bmp.biClrImportant),sizeof(int),1,file)

printf("\n bmp biClrImportant: %d\n",bmp.biClrImportant)

fseek(file,(long)(bmp.bfOffBits),0)

fwrite(imagedata,sizeof(unsigned char),bmp.biSizeImage,file)

fclose(file)

}

//pixProcess.c文件

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#include"image.h"

//灰度化

void image_gray()

{

int i,j

unsigned char tmp

for (i=0i<bmp.biHeighti++)

{

for (j=0j<line_byte/3j++)

{

tmp=0.11*(*(imagedata+i*line_byte+j*3+0))+0.59*(*(imagedata+i*line_byte+j*3+1))+0.3*(*(imagedata+i*line_byte+j*3+2))

imagedata[i*line_byte+j*3+0]=tmp

imagedata[i*line_byte+j*3+1]=tmp

imagedata[i*line_byte+j*3+2]=tmp

//printf("\nnidsfh%d%d",i,j)

}

}

}

//二值化

void image_binarization()

{

int i,j

for (i=0i<bmp.biHeighti++)

{

for (j=0j<line_bytej++)

{

if ((*(imagedata+i*line_byte+j))<128)

{

imagedata[i*line_byte+j]=0

}

else

{

imagedata[i*line_byte+j]=255

}

}

}

}

void image_opposite() //反相

{

int i,j

for (i=0i<bmp.biHeighti++)

{

for (j=0j<line_bytej++)

{

imagedata[i*line_byte+j]=abs(255-imagedata[i*line_byte+j])

}

}

}

void image_channel() //抽取RGB通道

{

int i,j

char rgb

printf("\nplease enter a char(r/g/b): ")

fflush(stdin)

scanf("%c",&rgb)

if (rgb=='b')

{

for (i=0i<bmp.biHeighti++)

{

for (j=0j<line_byte/3j++)

{

imagedata[i*line_byte+3*j+1]=0

imagedata[i*line_byte+3*j+2]=0

}

}

}

else if(rgb=='g')

{

for (i=0i<bmp.biHeighti++)

{

for (j=0j<line_byte/3j++)

{

imagedata[i*line_byte+3*j]=0

imagedata[i*line_byte+3*j+2]=0

}

}

}

else

{

for (i=0i<bmp.biHeighti++)

{

for (j=0j<line_byte/3j++)

{

imagedata[i*line_byte+3*j]=0

imagedata[i*line_byte+3*j+1]=0

}

}

}

}

void image_bright()//改变图像亮度

{

int level

int i,j

printf("\n please enter the level of brightness[-255 to 255] :")

fflush(stdin)

scanf("%d",&level)

for (i=0i<bmp.biHeighti++)

{

for (j=0j<line_bytej++)

{

if (level>=0)

{

if ((imagedata[i*line_byte+j]+level)>255)

imagedata[i*line_byte+j]=255

else

imagedata[i*line_byte+j]+=level

}

else

{

if ((imagedata[i*line_byte+j]-abs(level))<0)

imagedata[i*line_byte+j]=0

else

imagedata[i*line_byte+j]+=level

}

}

}

}

//void image_create() //创建一幅24位BMP图像文件。

//{

//main.c文件

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<conio.h>

#include"image.h"

BMP bmp

int main()

{

FILE *file=NULL

int choose

char gono

do

{

image_info(file) //imagedata已经分配了动态内存,但是没有释放

printf("\n 1.image_opposite")

printf("\n 2.image_gray")

printf("\n 3.image_binarization")

printf("\n 4.image_channel")

printf("\n 5.image_brightness")

//printf("6.image_opposite")

//printf("7.image_opposite")

printf("\nchoose your options:")

fflush(stdin)

scanf("%d",&choose)

switch(choose)

{

case 1:

image_opposite()

image_save(file)

free(imagedata)

break

case 2:

image_gray()

image_save(file)

free(imagedata)

break

case 3:

image_binarization()

image_save(file)

free(imagedata)

break

case 4:

image_channel()

image_save(file)

free(imagedata)

break

case 5:

image_bright()

image_save(file)

free(imagedata)

break

default:

printf("\n wrong choose!")

}

printf("\nlet's go on?(y/n):")

fflush(stdin)

scanf("%c",&gono)

if (gono=='n')

{

printf("\nbye bye!")

break

}

}

while(1)

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12479879.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存