关于图像显示有很多库可以用,Windows下有GDI,GDI+,D3D等,Linux下有X Window和Wayland,此外还有OpenGL ,SDL等图形库以及各种GUI库。

  了解最原始的方式,对于加深理解依然是有帮助的。下面给Windows和Linux下显示位图的最简单例子:

1.Windows用GDI显示图像的例子:

 /*
* FileName: Image_Win.c
* Usage: tcc -luser32 -lgdi32 -run Image_Win.c
*/ #include <windows.h>
#include <stdlib.h>
//
typedef unsigned char byte; typedef struct {
int Width;
int Height;
byte *Data;
} Image; LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM w, LPARAM l)
{
HDC hdc;
RECT rect;
Image img;
BITMAPINFO bmi;
PAINTSTRUCT ps;
int iRowLength;
//
ZeroMemory(&bmi, sizeof(BITMAPINFO));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biPlanes = ;
bmi.bmiHeader.biBitCount = ;
bmi.bmiHeader.biCompression = BI_RGB;
//
switch (msg) {
case WM_DESTROY:
PostQuitMessage();
break;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect(hwnd,&rect);
img.Width = rect.right - rect.left;
iRowLength = ((img.Width* * + ) & ~) >> ;
img.Height = rect.bottom - rect.top;
img.Data = (byte*)malloc(iRowLength*img.Height);
for(int i=;i<iRowLength*img.Height;i++)
img.Data[i] = rand()%;
bmi.bmiHeader.biWidth = img.Width;
bmi.bmiHeader.biHeight = img.Height;
SetDIBitsToDevice(hdc, , , img.Width, img.Height,
, , , img.Height, img.Data, &bmi, DIB_RGB_COLORS);
break;
default:
return DefWindowProc(hwnd, msg, w, l);
}
return ;
} int main(int argc, char* argv[])
{
static TCHAR szAppName[] = TEXT("RandColor");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
int iCmdShow = ;
HINSTANCE hInstance = NULL;
//
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = ;
wndclass.cbWndExtra = ;
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 ;
}
hwnd = CreateWindow(szAppName, TEXT("Image"), WS_OVERLAPPEDWINDOW^WS_THICKFRAME,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
//The message loop.
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd); while (GetMessage(&msg, NULL, , )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return ;
}

  

2.Linux下用X Window显示图像的例子:

 /*
* FileName: Image_Linux.c
* Usage: tcc -lX11 -run Image_Linux.c
*/
#include <X11/Xlib.h>
#include <X11/Xutil.h> #include <stdlib.h> #define WIDTH 640
#define HEIGHT 480 int main(int argc, char **argv)
{
int win_b_color;
int win_w_color;
XEvent xev;
Window window;
Visual *visual;
XImage *ximage;
GC gc; char*buffer=(char*)malloc(WIDTH*HEIGHT**sizeof(char)); Display *display = XOpenDisplay(NULL);
win_b_color = BlackPixel(display, DefaultScreen(display));
win_w_color = BlackPixel(display, DefaultScreen(display));
window = XCreateSimpleWindow(display,DefaultRootWindow(display),, , WIDTH, HEIGHT, ,win_b_color, win_w_color);
visual = DefaultVisual(display, );
//XSelectInput(display, window, ExposureMask | KeyPressMask);
XMapWindow(display, window);
XFlush(display);
gc = XCreateGC(display, window, , NULL);
//XEvent event;
while () {
for (int i = ; i < WIDTH*HEIGHT*; i ++)
buffer[i] = rand()%;
ximage=XCreateImage(display, visual, ,ZPixmap, , buffer,WIDTH, HEIGHT, , );
XPutImage(display, window,gc, ximage, , , , ,WIDTH, HEIGHT);
}
return ;
}

  下一次将介绍矢量图方面的知识,主要以EMF,SVG和PostScript进行说明。

C语言漫谈(二) 图像显示 Windows和Linux的更多相关文章

  1. C语言集锦(二) 图像显示 Windows和Linux

    关于图像显示有很多库可以用,Windows下有GDI,GDI+,D3D等,Linux下有X Window和Wayland,此外还有OpenGL ,SDL等图形库以及各种GUI库. 了解最原始的方式,对 ...

  2. C语言:源代码兼容WINDOWS LINUX

    使用库函数之前,应该用#include引入对应的头文件.这种以#号开头的命令称为预处理命令.C语言源文件要经过编译.链接才能生成可执行程序:1) 编译(Compile)会将源文件(.c文件)转换为目标 ...

  3. 由于Windows和Linux行尾标识引起脚本无法运行的解决

    在所有的操作系统中,文本文件的结束或者换行都是有行尾符来标识的,C语言中经常使用\n作为换行,\r作为跳格TAB:实际上在计算机还没有真正出现之前,有种电传打字机的设备,每秒钟可以打印10个字符,但是 ...

  4. 从Windows到linux小记

    从Windows到linux小记 年后疯狂加班,趁着喘息的时间,更新一下安装linux的艰辛路程. 周四晚上,公司举办活动,好不容易从加班的节奏暂时脱离出来,我这人就是不能闲,只要一闲下来就会做die ...

  5. 全网最详细的Git学习系列之介绍各个Git图形客户端(Windows、Linux、Mac系统皆适用ing)(图文详解)

    不多说,直接上干货! 一.TortoiseGit - The coolest Interface to Git Version Control TortoiseGit 是 TortoiseSVN 的  ...

  6. Scrapy的安装--------Windows、linux、mac等操作平台

    Scrapy安装 Scrapy的安装有多种方式,它支持Python2.7版本及以上或者是Python3.3版本及以上.下面来说py3环境下,scrapy的安装过程. Scrapy依赖的库比较多,至少需 ...

  7. Centos 6.x 安装Nagios及WEB管理nagiosql实现windows及linux监控指南

    一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报 ...

  8. 3.0 Windows和Linux双系统安装(3)

    3.0 Windows和Linux双系统安装(3) 3.1 精简的安装步骤如下:(如果已经有了前面两篇教程的安装经验,推荐看完3.1即可动手了) 双系统很多开发新人会用到,而且比起虚拟机好处是运行效率 ...

  9. iconv简介(1、字符串|文件字符转换:iconv用于将一种已知的字符集文件转换成另一种已知的字符集文件)(2、编程语言函数功能的相似性:iconv不仅再php中有用,而且c语言中也有用,还有linux等)

    iconv简介(1.字符串|文件字符转换:iconv用于将一种已知的字符集文件转换成另一种已知的字符集文件)(2.编程语言函数功能的相似性:iconv不仅再php中有用,而且c语言中也有用,还有lin ...

随机推荐

  1. NetAnalyzer笔记 之 七 NetAnalyzer2016使用方法(1)

    [创建时间:2016-04-17 14:47:00] NetAnalyzer下载地址 距离新本的NetAnalyzer已经发布一段时间了,因为比较忙期间只出了一个视频教程,一直没有来的急写文档,今天就 ...

  2. 【ArcGIS 10.2新特性】ArcGIS Online新特性(上)

    概述 7月,ArcGIS Online发布了很多更新.主要内容有:新的网站设计,增强了Web制图,数据分析,应用程序创建,以及机构管理等功能. 更新的大致内容总结如下: 地图查看器:新的分析工具.获取 ...

  3. cocos2d-x 3.6版连连看

    写个连连看来讲游戏开发,我认为实例解说效果会好一些. 终端以下cd到源代码文件夹,敲命令: cocos new LLK -p com.goonear.llk -l cpp -d ./Goonear 脚 ...

  4. Linux环境下Eclipse + Tomcat + MySQL 配置J2EE开发环境的方法

    1. 版本号信息 (1)CentOS 6.4发行版64位,uname -a 显演示样例如以下: Linux localhost.localdomain 3.11.6 #1 SMP Sat Nov 2 ...

  5. 一张图搞懂 Javascript 中的原型链、prototype、__proto__的关系 转载加自己的总结

    1. JavaScript内置对象 所谓的内置对象 指的是:JavaScript本身就自己有的对象 可以直接拿来就用.例如Array String 等等.JavaScript一共有12内置对象    ...

  6. 注意:"AspNetPager”的控件“AspNetPager1”必须放在具有 runat=server 的窗体标记内

    应加: <form id="form1" runat="server"> </form> 否则一开始什么也不显示,页面控件看不见,加上a ...

  7. javaWeb RSA加密使用

      加密算法在各个网站运用很平常,今天整理代码的时候看到了我们项目中运用了RSA加密,就了解了一下. 先简单说一下RSA加密算法原理,RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但 ...

  8. hdfs-over-ftp安装与配置

    hdfs-over-ftp是一个开源,简单易用的实现了对HDFS系统的下载和上传功能的小工具.可以作为管理工具来使用,快捷方便. 1 安装jdk(1.6以上版本)并配置环境变量分别执行java -ve ...

  9. jar打包命令

    jar查看jar命令的使用 1. jar cvf 生成jar包的完整名称 要生成的class文件所在目录以及名称 jar -cvf aa.jar *.* 2.将jar包放到环境变量中,可以不用把cla ...

  10. SharpZipLib 压缩文档下载

    using ICSharpCode.SharpZipLib.Zip; Response.Clear(); Response.ClearContent(); Response.ClearHeaders( ...