C语言漫谈(二) 图像显示 Windows和Linux

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

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

  Windows用GDI显示图像的例子:

 1 /*
 2 * FileName: Image_Win.c
 3 * Usage:    tcc -luser32 -lgdi32 -run Image_Win.c
 4 */
 5
 6 #include <windows.h>
 7 #include <stdlib.h>
 8 //
 9 typedef unsigned char byte;
10
11 typedef struct {
12     int Width;
13     int Height;
14     byte *Data;
15 } Image;
16
17 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM w, LPARAM l)
18 {
19     HDC hdc;
20     RECT rect;
21     Image img;
22     BITMAPINFO bmi;
23     PAINTSTRUCT ps;
24     int iRowLength;
25     //
26     ZeroMemory(&bmi, sizeof(BITMAPINFO));
27     bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
28     bmi.bmiHeader.biPlanes = 1;
29     bmi.bmiHeader.biBitCount = 24;
30     bmi.bmiHeader.biCompression = BI_RGB;
31     //
32     switch (msg) {
33     case WM_DESTROY:
34         PostQuitMessage(1);
35         break;
36     case WM_PAINT:
37         hdc = BeginPaint (hwnd, &ps) ;
38         GetClientRect(hwnd,&rect);
39         img.Width = rect.right - rect.left;
40         iRowLength = ((img.Width*8 * 3 + 31) & ~31) >> 3;
41         img.Height = rect.bottom - rect.top;
42         img.Data =  (byte*)malloc(iRowLength*img.Height);
43         for(int i=0;i<iRowLength*img.Height;i++)
44             img.Data[i] = rand()%256;
45         bmi.bmiHeader.biWidth = img.Width;
46         bmi.bmiHeader.biHeight = img.Height;
47         SetDIBitsToDevice(hdc, 0, 0, img.Width, img.Height,
48                           0, 0, 0, img.Height, img.Data, &bmi, DIB_RGB_COLORS);
49         break;
50     default:
51         return DefWindowProc(hwnd, msg, w, l);
52     }
53     return 0;
54 }
55
56 int main(int argc, char* argv[])
57 {
58     static TCHAR szAppName[] = TEXT("RandColor");
59     HWND         hwnd;
60     MSG          msg;
61     WNDCLASS     wndclass;
62     int iCmdShow = 1;
63     HINSTANCE hInstance = NULL;
64     //
65     wndclass.style = CS_HREDRAW | CS_VREDRAW;
66     wndclass.lpfnWndProc = WndProc;
67     wndclass.cbClsExtra = 0;
68     wndclass.cbWndExtra = 0;
69     wndclass.hInstance = hInstance;
70     wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
71     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
72     wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
73     wndclass.lpszMenuName = NULL;
74     wndclass.lpszClassName = szAppName;
75     if (!RegisterClass(&wndclass)) {
76         MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
77         return 0;
78     }
79     hwnd = CreateWindow(szAppName, TEXT("Image"), WS_OVERLAPPEDWINDOW^WS_THICKFRAME,
80                         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
81                         NULL, NULL, hInstance, NULL);
82     //The message loop.
83     ShowWindow(hwnd, iCmdShow);
84     UpdateWindow(hwnd);
85
86     while (GetMessage(&msg, NULL, 0, 0)) {
87         TranslateMessage(&msg);
88         DispatchMessage(&msg);
89     }
90     return 0;
91 }

  

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

 1 /*
 2 * FileName: Image_Linux.c
 3 * Usage:    tcc -lX11 -run Image_Linux.c
 4 */
 5 #include <X11/Xlib.h>
 6 #include <X11/Xutil.h>
 7
 8 #include <stdlib.h>
 9
10 #define WIDTH 640
11 #define HEIGHT 480
12
13 int main(int argc, char **argv)
14 {
15     int win_b_color;
16     int win_w_color;
17     XEvent xev;
18     Window window;
19     Visual *visual;
20     XImage *ximage;
21     GC gc;
22
23     char*buffer=(char*)malloc(WIDTH*HEIGHT*4*sizeof(char));
24
25     Display *display = XOpenDisplay(NULL);
26     win_b_color = BlackPixel(display, DefaultScreen(display));
27     win_w_color = BlackPixel(display, DefaultScreen(display));
28     window = XCreateSimpleWindow(display,DefaultRootWindow(display),0, 0, WIDTH, HEIGHT, 0,win_b_color, win_w_color);
29     visual = DefaultVisual(display, 0);
30     //XSelectInput(display, window, ExposureMask | KeyPressMask);
31     XMapWindow(display, window);
32     XFlush(display);
33     gc = XCreateGC(display, window, 0, NULL);
34     //XEvent event;
35     while (1) {
36         for (int i = 0; i < WIDTH*HEIGHT*4; i ++)
37             buffer[i] = rand()%256;
38         ximage=XCreateImage(display, visual, 24,ZPixmap, 0, buffer,WIDTH, HEIGHT, 32, 0);
39         XPutImage(display, window,gc, ximage, 0, 0, 0, 0,WIDTH, HEIGHT);
40     }
41     return 0;
42 }

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

时间: 2024-07-28 20:45:30

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

嵌入式linux C++语言(二)——C++对C语言基础语法的扩展

嵌入式linux C++语言(二)--C++对C语言基础语法的扩展 C++是基于C语言扩展发展而来的面向对象的程序设计语言,本文将主要讨论C++语言基于C语言扩展的方面. 一.类型增强 1.类型检查更严格 在C语言中: const int a = 100; int *p = &a; 在C++语言中: const int a = 100;//必须在定义的时候初始化 const int *p = &a; 在C++语言中不能隐式转换数据类型. error: invalid conversion

嵌入式linux面试题解析(二)——C语言部分二

嵌入式linux面试题解析(二)--C语言部分二 1..h头文件中的ifndef/define/endif 的作用?    答:防止该头文件被重复引用. 2.#include 与 #include "file.h"的区别?    答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h. 3.描述实时系统的基本特性    答 :在特定时间内完成特定的任务,实时性与可靠性. 4.全局变量和局部变量在内存中是否有区别?如果有,是

kafka环境搭建二---Windows客户端Linux服务器

一.对于服务器端的搭建可以参考上一篇文章:kafka单机版环境搭建与测试 服务器端IP :10.0.30.221 运行环境的目录如下: 需要改动config文件夹下的server.properties中的以下两个属性 zookeeper.connect=localhost:2181改成zookeeper.connect=10.0.30.221:2181 以及默认注释掉的 #host.name=localhost改成host.name=10.0.30.221 host.name不更改会造成客户端报

嵌入式Linux C语言(二)——指针

嵌入式Linux C语言(二)--指针 指针是C语言中广泛使用的一种数据类型,是C语言的灵魂.指针提供了动态操控内存的机制,强化了对数据结构的支持,而且实现了访问硬件的功能.学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志. 一.指针的概念 在计算机中,所有的数据都是存放在内存中的,一般把内存中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不一样,如int占用4个字 节,char占用1个字节.为了正确地访问内存单元,必须为每个内存单元编上号.

zabbix监控MySQL(windows和linux环境)

一.linux环境下监控MySQL Zabbix Server自带了MySQL插件来监控mysql数据库的模板,只需要配置好agent客户端,然后在web端给主机增加模板就行了 监控项目: Com_update:     mysql执行的更新个数 Com_select:     mysql执行的查询个数 Com_insert:     mysql执行插入的个数 Com_delete:     执行删除的个数 Com_rollback:   执行回滚的操作个数 Bytes_received:  接

Windows和linux虚拟机之间联网实现SSH远程连接以及VMware的3种网络模式[NAT、桥接和Host-only]

Windows和linux虚拟机之间联网实现SSH远程连接以及VMware的3种网络模式[NAT.桥接和Host-only] 作者:天齐 一.Windows和linux虚拟机之间联网实现SSH远程连接 假如我们要给主机名为mini1的虚拟机配置ip地址,需要以下几个步骤: 在linux上查看ip地址,如果linux服务器有ip地址,让它的ip地址和windows的ip地址在同一个网段,它们之间才能联网.在linux上查看ip地址的命令为"ifconfig": 发现eth0网卡没有配置i

【大话QT之五】Windows与Linux下文件操作监控的实现

一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场上网盘实现有一些的不同,主要在客户端与服务器端的操作需要双向进行,即:用户在客户端的操作需要及时同步到服务器端:在服务器端作业渲染生成的文件要及时同步到客户端.即:用户不在需要单独的下载数据,而是在作业运行的同时,渲染就过就会自动同步到客户端,大大缩短了等待时间.当然,无论是在客户端还是在服务端都面

Windows,linux下编译qt源码(比较简单)

一.linux下静态编译qt源码 1.取到qt源码并解压到文件夹 2.cd到qt目录下 3.使用configure生成makefile ./configure–prefix /opt/qtstatic –static –release -nomake examples  --nomake demos-nomake docs -continue 4.待执行完之后执行make 5.makeinstall 参考:http://www.cnblogs.com/qianyuming/archive/201

使用VNC实现Windows对Linux的远程连接

一:Linux系统中VNCServer的配置 1.确认你服务器是否配置了VNCServer,可以在命令行下敲入以下命令查看: rpm -qa |grep vnc 本实验的操作系统CentOS6.4默认已经安装了VNC Server软件包.如果没有安装VNCServer,那么从光盘找到安装包进行安装. 2.启动VNCServer(vncserver :1) vncserver 如果第一次配置VNC Server,会要求提供登录VNC使用的密码,以后也可以使用vncpasswd来修改密码. 3.修改