!变量作为数组长度:GNU C的扩展语法,
!在使用g++或者clang++编译器的时候,可以使用;在VS或者VC6.0编译器的时候,会报错
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
#define STB_IMAGE_RESIZE_IMPLEMENTATION
#include "stb_image_resize2.h"
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
using namespace std;
int main() {
if(1)
{
int iw,ih,n;
// 输入图像:读取图像信息(像素值,宽,高,通道)
unsigned char *pSrcData = stbi_load("../../Picture/pic_600X631.png", &iw, &ih, &n, 0);
printf("ImageFileIn: iw=%d, ih=%d, ch=%d \n", iw, ih, n );
// 输出图像:申请像素缓存
int w = iw*1.0 ;
int h = ih*1.0 ;
unsigned char pixel[h][w][n] = {0}; // [Y][X][RGB/RGBA]
// 输出图像:尺寸变换
stbir_resize(pSrcData, w, h, 0, pixel, w, h, 0,
(stbir_pixel_layout)n, STBIR_TYPE_UINT8,
STBIR_EDGE_CLAMP, STBIR_FILTER_BOX
);
// 输出图像:像素点处理
enum ENUM_RGBA{R,G,B,A}; // 小端存储的地址索引
// 像素通道 n = 一个像素的字节量 (n=3:RGB; n=4:RGBA)
// 一个像素size = n*Byte = n
// m 个像素size = (n*Byte)*m = n*m
// 整行长度size = (n*Byte)*(COL) = n*COL*1
// i行j列的size = (n*Byte)*(COL*i)+(n*Byte)*j = n*(COL*i+j)
// i行j列的RGBA = 小端存储(R低A高)-机器内存[#ABGR] = n*(COL*i+j)+0/1/2/3
int fixed_col = w/2;
for(int j=0; j<h; j++) // h-y方向扫描:列线
{ // 寻址方式1:底层计算,贴近机器
*((unsigned char *)pixel+ n*( w*j+ fixed_col )+ 0) = 255;
*((unsigned char *)pixel+ n*( w*j+ fixed_col )+ 1) = 0;
*((unsigned char *)pixel+ n*( w*j+ fixed_col )+ 2) = 0;
}
int fixed_row = h/2;
for(int i=0; i<w; i++) // w- x方向扫描:行线
{ // 寻址方式2:索引封装,对人友好
pixel[fixed_row][i][R] = 0;
pixel[fixed_row][i][G] = 0;
pixel[fixed_row][i][B] = 255;
}
// 输出图像:写入文件
string name = "../../Picture/pic_600X631_mdy.jpg";
stbi_write_jpg(name.c_str(), w, h, n, pixel, 100);
string name2 = "../../Picture/pic_600X631_mdy.png";
stbi_write_png(name2.c_str(),w,h,n,pixel,0);
// 释放缓存
stbi_image_free(pSrcData);
stbi_image_free(pixel);
}
return 0;
}
图像处理:stb_image库,像素矩阵的两种寻址写法
于 2024-09-26 15:28:05 首次发布