图像处理:stb_image库,像素矩阵的两种寻址写法

!变量作为数组长度: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值