stb (c++) 放缩图片

目录

jpg图片

Resize: 200x100

修改放缩后的像素值

中间-1列

蓝色

png图片

Resize: 200x100

修改放缩后的像素值

中间-1列

红色


图片来自:stb (c++) 操作 jpg图片

图片来自:stb (c++) 操作png图片

jpg图片

Resize: 200x100
#include <iostream>
#define STB_IMAGE_IMPLEMENTATION
#include "stb/stb_image.h"
#define STB_IMAGE_RESIZE_IMPLEMENTATION
#include "stb/stb_image_resize.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb/stb_image_write.h"

using namespace std;

int main()
{
    int w,h,n;
    unsigned char *data = stbi_load("./s_l.jpg", &w, &h, &n, 0);
    cout << "宽: " << w << endl;
    cout << "高: " << h << endl;
    cout << "channel: " << n << endl;

    auto *re_data = (unsigned char *) malloc(200*100*3);
    stbir_resize(data, w, h, 0, re_data, 200, 100, 0, STBIR_TYPE_UINT8, n, STBIR_ALPHA_CHANNEL_NONE, 0,
                 STBIR_EDGE_CLAMP, STBIR_EDGE_CLAMP,
                 STBIR_FILTER_BOX, STBIR_FILTER_BOX,
                 STBIR_COLORSPACE_SRGB, nullptr
    );
    string name = "s_l-jpg.jpg";
    stbi_write_jpg(name.c_str(), 200, 100, n, re_data, 95);
    string name2 = "s_l-png.png";
    stbi_write_png(name2.c_str(),200,100,n,re_data,0);
    
    stbi_image_free(data);
    stbi_image_free(re_data);
}
宽: 400
高: 328
channel: 3

修改放缩后的像素值
中间-1列
蓝色
#include <iostream>
#define STB_IMAGE_IMPLEMENTATION
#include "stb/stb_image.h"
#define STB_IMAGE_RESIZE_IMPLEMENTATION
#include "stb/stb_image_resize.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb/stb_image_write.h"

using namespace std;

int main()
{
    int w,h,n;
    unsigned char *data = stbi_load("./s_l.jpg", &w, &h, &n, 0);

    auto *re_data = (unsigned char *) malloc(200*100*n);
    stbir_resize(data, w, h, 0, re_data, 200, 100, 0, STBIR_TYPE_UINT8, n, STBIR_ALPHA_CHANNEL_NONE, 0,
                 STBIR_EDGE_CLAMP, STBIR_EDGE_CLAMP,
                 STBIR_FILTER_BOX, STBIR_FILTER_BOX,
                 STBIR_COLORSPACE_SRGB, nullptr
    );
    int red_col = 200/2;
    for(int i=0; i<100; i++)
    {
        re_data[200*i*n+red_col*n+0] = 0;
        re_data[200*i*n+red_col*n+1] = 0;
        re_data[200*i*n+red_col*n+2] = 255;
    }
    string name = "s_l-jpg.jpg";
    stbi_write_jpg(name.c_str(), 200, 100, n, re_data, 95);
    string name2 = "s_l-png.png";
    stbi_write_png(name2.c_str(),200,100,n,re_data,0);

    stbi_image_free(data);
    stbi_image_free(re_data);
}

png图片

Resize: 200x100
#include <iostream>
#define STB_IMAGE_IMPLEMENTATION
#include "stb/stb_image.h"
#define STB_IMAGE_RESIZE_IMPLEMENTATION
#include "stb/stb_image_resize.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb/stb_image_write.h"

using namespace std;

int main()
{
    int w,h,n;
    unsigned char *data = stbi_load("./world.png", &w, &h, &n, 0);
    cout << "宽: " << w << endl;
    cout << "高: " << h << endl;
    cout << "channel: " << n << endl;

    auto *re_data = (unsigned char *) malloc(200*100*n);
    stbir_resize(data, w, h, 0, re_data, 200, 100, 0, STBIR_TYPE_UINT8, n, STBIR_ALPHA_CHANNEL_NONE, 0,
                 STBIR_EDGE_CLAMP, STBIR_EDGE_CLAMP,
                 STBIR_FILTER_BOX, STBIR_FILTER_BOX,
                 STBIR_COLORSPACE_SRGB, nullptr
    );
    string name = "world-jpg.jpg";
    stbi_write_jpg(name.c_str(), 200, 100, n, re_data, 95);
    string name2 = "world-png.png";
    stbi_write_png(name2.c_str(),200,100,n,re_data,0);

    stbi_image_free(data);
    stbi_image_free(re_data);
}
宽: 1950
高: 1092
channel: 4

修改放缩后的像素值
中间-1列
红色
#include <iostream>
#define STB_IMAGE_IMPLEMENTATION
#include "stb/stb_image.h"
#define STB_IMAGE_RESIZE_IMPLEMENTATION
#include "stb/stb_image_resize.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb/stb_image_write.h"

using namespace std;

int main()
{
    int w,h,n;
    unsigned char *data = stbi_load("./world.png", &w, &h, &n, 0);

    auto *re_data = (unsigned char *) malloc(200*100*n);
    stbir_resize(data, w, h, 0, re_data, 200, 100, 0, STBIR_TYPE_UINT8, n, STBIR_ALPHA_CHANNEL_NONE, 0,
                 STBIR_EDGE_CLAMP, STBIR_EDGE_CLAMP,
                 STBIR_FILTER_BOX, STBIR_FILTER_BOX,
                 STBIR_COLORSPACE_SRGB, nullptr
    );
    int red_col = 200/2;
    for(int i=0; i<100; i++)
    {
        re_data[200*i*n+red_col*n+0] = 255;
        re_data[200*i*n+red_col*n+1] = 0;
        re_data[200*i*n+red_col*n+2] = 0;
    }
    string name = "world-jpg.jpg";
    stbi_write_jpg(name.c_str(), 200, 100, n, re_data, 95);
    string name2 = "world-png.png";
    stbi_write_png(name2.c_str(),200,100,n,re_data,0);

    stbi_image_free(data);
    stbi_image_free(re_data);
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果想使用 C 语言读取图片,您可以使用一些图像处理库,例如 libjpeg,libpng 或 libtiff。这些库提供了读取和写入图像数据的函数,您可以使用它们读取图像文件。如果不知道如何使用这些库,您可以查找在线教程和文档,学习如何使用它们读取图像。 ### 回答2: 在C语言中,可以使用第三方库来读取并处理图片。以下是一个简单的示例代码,使用了开源库stb_image来读取图片。 1. 首先,你需要下载stb_image库并将其包含到你的项目中。你可以从GitHub的stb_image页面(https://github.com/nothings/stb)下载和导入它。 2. 接下来,你需要创建一个C文件,并将以下代码复制到文件中: ``` #include <stdio.h> #include <stdint.h> #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" int main(void) { char* filename = "path/to/your/image.jpg"; // 在这里替换为你的图片路径 int width, height, channels; uint8_t* image = stbi_load(filename, &width, &height, &channels, 0); if(image == NULL) { printf("无法读取图片。\n"); return 1; } printf("宽度:%d\n", width); printf("高度:%d\n", height); printf("通道数:%d\n", channels); // 在这里你可以对图片的像素进行处理 stbi_image_free(image); return 0; } ``` 3. 将注释中的路径替换为你想要读取的图片的路径。 4. 编译并运行代码,你将会看到图片的宽度、高度和通道数的输出。 这只是读取图片的最基本示例,你可以根据需要进一步处理图像。stb_image库还支持其他功能,如选择像素读取的起始坐标、以及转换图像格式等。你可以在stb_image的文档页面(https://github.com/nothings/stb/blob/master/stb_image.h)中找到更多有关库的详细信息和示例代码。 ### 回答3: 使用C语言读取图片需要借助图像处理库,如OpenCV或libpng等。 一般来说,读取图片的过程分为以下几个步骤: 1. 首先,需要包含相应的头文件和链接对应的库文件。比如使用OpenCV,需要包含头文件`#include <opencv2/opencv.hpp>`,并链接库文件`-lopencv_core -lopencv_imgcodecs`。 2. 创建一个`Mat`对象,用于存储图像数据。`Mat`是OpenCV库中常用的图像容器,可以用于存储图片的像素数据。 3. 使用`imread`函数读取图像文件。该函数的参数为图片文件的路径,返回一个`Mat`对象。例如,`Mat image = imread("image.jpg");`。 4. 检查图像是否成功加载。可以通过判断`image.empty()`的返回值来判断,如果返回true,则说明图像未成功加载。 5. 使用`imshow`函数显示图像。该函数的参数为一个窗口名称和一个`Mat`对象。例如,`imshow("window", image);`。 6. 使用`waitKey`函数等待按键输入。该函数会暂停程序的执行,直到用户按下某个键。参数为等待时间,通常设为0即可。例如,`waitKey(0);`。 整个流程如下所示: ```c #include <opencv2/opencv.hpp> int main() { cv::Mat image = cv::imread("image.jpg"); if (image.empty()) { printf("Failed to read image."); return -1; } cv::imshow("window", image); cv::waitKey(0); return 0; } ``` 以上就是使用C语言读取图片的基本步骤,当然具体实现还需要根据所用的图像处理库做相应的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值