c 生成16×16像素点的rgb格式图片

2023-12-31 20:11:46

想验证jpeg 编解码各个环节是否正确,特小尺寸的rgb格式图片找不到。特意用c代码生成一个16×16像素点的rgb格式图片,

再把此格式转换为yuv444格式,再8×8分割,量化,Z变换,霍夫曼编码,生成比特流,再反向解码,最后还原成图片

每一个像素点的红,绿,兰三分量用一个int表示,此整数的最高位char空,最低char为蓝色分量,第二个char为绿,第三个为红。



#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>  
#include <string.h>
#include <sys/mman.h>
#include <linux/fb.h>

#define  pic_width  16          //水平16个像素
#define  pic_heigth  16         //垂直16个像素
#define  file  "/home/wzpc/Pictures/16*16.rgb"
static	int sp[pic_width*pic_heigth];
static struct fb_var_screeninfo var;

int main(void)
{
  
	int t=0;
	for(int a=0;a<pic_heigth/4;a++){
		for(int b=0;b<pic_width;b++){     
			sp[t]=0xff<<16|0x0<<8|0x0;      //生成红色水平条
			t++;
		}
	}
	for(int a=0;a<pic_heigth/4;a++){
		for(int b=0;b<pic_width;b++){
			sp[t]=0x0<<16|0xff<<8|0x0;      //生成绿色水平条
			t++;
		}
	}
	for(int a=0;a<pic_heigth/4;a++){
		for(int b=0;b<pic_width;b++){       //生成白色水平条
			sp[t]=0x0<<16|0x0<<8|0xff;
			t++;
		}
	}
	for(int a=0;a<pic_heigth/4;a++){
		for(int b=0;b<pic_width;b++){
			sp[t]=0xff<<16|0xff<<8|0xff;     //生成白色条
			t++;
		}
	}
    

		
//---终端显示-----------------------------
	int fd_fb = open("/dev/fb0", O_RDWR);
	if (fd_fb < 0)
	{
		puts("/dev/fb0 error");
		return -1;
	}
	if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var))
	{
		puts("ioctl error");
		return -1;
	}
	
//	unsigned int  pixel_width = var.bits_per_pixel / 8;                  //deepin=32
	int screen_size = var.xres * var.yres * var.bits_per_pixel / 8;
	
	unsigned char *fb_base = mmap(NULL, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
	if (fb_base == NULL)
	{
		puts("mmap error");
		return -1;
	}
	memset(fb_base,0, screen_size);
	
	int zz=0;
	for(int a=0;a<pic_heigth;a++){
		for(int b=0;b<pic_width;b++){
			
			
			unsigned int (*p)[var.xres]=(unsigned int (*)[var.xres])fb_base;
			
			p[a][b]=sp[zz];   //sp[zz]
			zz++;
		}
	}
	
	munmap(fb_base, screen_size);
	
	close(fd_fb);
	puts("over");
	
	return 0;
}

只有256个像素点,图像非常小。红,绿,蓝,白4个水平条图案

5cb28d34d8eb41168d642e1d37309eab.jpg

?

?

?

?

?

文章来源:https://blog.csdn.net/m0_59802969/article/details/135318169
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。