linux下使用cmake和libpng来对png图像进行读写

news2024/9/26 3:31:03

目标

在进行图像处理操作之前,首要任务是确保能够正确地读取图像。编写纯 C 语言代码进行图像处理时,不太适宜使用 OpenCV2。因此,为了遵循标准且便于操作,我们采用 libpng 的代码库来实现对 PNG 图像的读写。之所以选择在 Linux 系统下进行此项操作,主要是因为许多库在 Linux 环境下的安装更为便捷,例如 libpng。而在 Windows 系统下,需要下载源码、进行编译以及配置路径等一系列操作,极为繁琐,这与我们进行算法学习的初衷背道而驰。对于那些在 Windows 系统下不想安装双系统的用户,可以使用 WSL(Windows Subsystem for Linux),这对于代码学习而言也十分便利,仅需使用 Visual Studio Code 进行链接即可。

实际代码

我们首先对图像进行读取操作,以获取图像的高度(h)、宽度(w)以及通道数(c),并进行输出,同时将数据重新写入以生成一张新的图像。在使用过程中,要求系统中已安装 libpng 库,并且在源文件中利用了他人编写好的 io_png.c 和 io_png.h 文件。
文件结构如下:为了方便查阅文件中的函数,将.c与.h文件放在了同一文件夹下。
在这里插入图片描述
main文件中并没有太多内容,仅仅是简单地调用了两个函数
io_png_read_f32函数输入了一个字符串,和三个变量,最后获得图像文件的整体数据和HWC信息。得到的数据是一个一维数组。
io_png_write_f32则根据输入的数据以及HWC生成图片并保存。

#include <stdio.h>
#include "io_png.h"
#include <string.h>
#include <stdlib.h>
#include <unistd.h> // 在gcc编译器中,使用的头文件因gcc版本的不同而不同

void main()
{
    char *image_path = "you png path";
    char *save_path = "you png save path";
    float *U = NULL;
      /* Size of the input image: N2xN1 matrix */
    size_t N2,N1;/* N2=number of rows (dx2) and N1=number of columns (dx1) */
    size_t Nc;   /* Number of channels */
    size_t NNc;  /* Total size of the image: N2xN1xNc */
    int flag;
    U = io_png_read_f32(image_path, &N1, &N2, &Nc);
    printf("image size is (%d, %d, %d)", (int)N1, (int)N2, (int)Nc);
    flag = io_png_write_f32(save_path, U, N1, N2, Nc);
    printf("flag is %d \n ", flag);
}

io_png的相关文件有点冗长,所以放在github中。
CMakeLists.txt的代码如下,重点是png的链接库记得加上,否则运行会报找不到对应的png函数。

cmake_minimum_required(VERSION 3.22)
project(val_test)
#debug版本才能调试
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
# 声明包含的*.c和*.h文件
set(HOME you_project_path)
file(GLOB SRC ${HOME}/src/*.c)
include_directories(${HOME}/src /usr/local/include)
# 声明可执行程序输出位置
set(EXECUTABLE_OUTPUT_PATH ${HOME}/output)
# # 指定库路径
# link_directories(${HOME}/static)
# 引用静态库,掐头去尾写中间 libxxx.a,要放在生成可执行程序前。
link_libraries(png m)
# 输出相关信息
message(STATUS "src files list: ${SRC}")
message(STATUS "HOME path: ${HOME}")
# 生成可执行程序
add_executable(main ${SRC})

要进行调试的话参考我之前问文章:
链接: 使用cmake编译后并debug可执行文件

上述代码运行后会在指定位置生成图像的复制,我们也可以改变N1,N2的值,查看结果。(会将图像的一部分数据保存为图像,生成不清晰的扭曲图)
在这里插入图片描述
代码保存在链接: github中的c_code里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2125936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS系统上Node.js安装与配置最佳实践

由于nvm下载node需要翻墙速度非常慢&#xff08;试过很多次都不行&#xff09;&#xff0c;所以推荐手动安装&#xff0c;步骤也很简单 1、官网下载 打开官网 Node.js官网下载 选择自己系统合适的版本下载&#xff0c;我这里下载的是Linux x64的v18.20版本 2.上传服务器 将…

【编译原理】编译器概述、编译器结构、编译器实例

编译器概述、编译器结构、编译器实例 编译器概述 1.编译器是一个程序 核心功能是把源代码翻译成目标代码 比如源代码&#xff1a;C/C&#xff0c;Java&#xff0c;C#&#xff0c;html 目标代码&#xff1a;X86&#xff0c;IA64,ARM,… 把一种源程序翻译成另外一种源程序&…

day19JS-AJAX

1. 什么是AJAX 原生生js中有两种通信&#xff0c;一个ajax&#xff0c;还有一个是fetch。 AJAX 并不是编程语言&#xff0c;是一种从网页访问 Web 服务器的技术。AJAX 代表异步 JavaScript 和 XML。 AJAX 使用浏览器内建的 XMLHttpRequest 对象从 web 服务器请求数据&#xff0…

RTR_Chapter_3

第三章 图形处理单元 在历史上&#xff0c;图形加速首先开始于三角形上的像素扫描线颜色插值&#xff0c;并在屏幕上显示这些颜色值。它包括访问图像数据的能力&#xff0c;这允许将纹理运用在表面上&#xff1b;添加用于插值和深度测试的硬件&#xff0c;这提供了内置的可见性…

Java学习Day41:骑龙救!(springMVC)

springMVC与sevlet都是对应表现层web的&#xff0c;但是越复杂的项目使用SpringMVC越方便 基于Java实现MVC模型的轻量级web框架 目标&#xff1a; 小案例&#xff1a; 1.导入依赖 spring-context: 提供 Spring 框架的核心功能&#xff0c;如依赖注入、事件发布和其他应用上…

R语言数据整理和分析(1)

跟着顶刊学习数据分析。本期参考文献《Trends in Dietary Vitamin A Intake Among US Adults by Race and Ethnicity, 2003-2018》&#xff0c;来源于JAMA&#xff0c;IF63.1。 该文研究&#xff1a;2003-2018年美国成年人按种族和民族划分的膳食维生素A摄入量趋势 方法学&am…

集成学习(Ensembling Learning)

0. 来源 概念比较全&#xff0c;可以作为目录&#xff0c;前置知识讲得好&#xff0c;其他一般。 01.内容简介_哔哩哔哩_bilibili01.内容简介是集成学习&#xff1a;XGBoost, lightGBM的第1集视频&#xff0c;该合集共计19集&#xff0c;视频收藏或关注UP主&#xff0c;及时了…

换个角度看PCIE发展史

讲点废话 按照我的习惯&#xff0c;在开始做一件事情之前&#xff0c;我倾向于介绍我做这个事情的思路和原因。因为往往误解就是从我们思考问题的方式开始的&#xff0c;我觉得交代清楚了我做事情的背景&#xff0c;那么你就可以顺着我的思路来思考&#xff0c;这个过程中也很…

【第29章】Spring Cloud之Sentinel规则

文章目录 前言一、规则的种类1. 流量控制规则 (FlowRule)2. 熔断降级规则 (DegradeRule)3. 系统保护规则 (SystemRule)4. 访问控制规则 (AuthorityRule)5. 热点规则 (ParamFlowRule)6.规则常量(RuleConstant) 二、查询更改规则1.查询规则(类型)2.查询规则(所有) 三、规则文件总…

Java预备知识 Day2

1.IDEA的简单使用与介绍 1.1 IDEA的项目工程介绍 Day2_0904&#xff1a;项目名称 E:\0_code\Day2_0904&#xff1a;表示当前项目所在路径 .idea&#xff1a;idea软件自动生成的文件夹&#xff0c;最好不要动 src&#xff1a;srcsourse→源&#xff0c;我们的源代码就放在这…

3.js - 着色器设置点材质(螺旋星系特效)

上图 着色器设置点材质时&#xff0c;在顶点着色器中&#xff0c;最好设置gl_PointSize&#xff0c;不然看不到你在页面中添加的点 main.js import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControlsimport gsap from gsapimp…

FIDAVL:基于视觉语言模型的假图像检测与归因 !

FIDAVL:基于视觉语言模型的假图像检测与归因 &#xff01; 这份完整版的大模型 AI 学习资料已经上传CSDN&#xff0c;朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】 作者提出了FIDAVL&#xff1a;使用视觉语言模型进行虚假图像检测。FIDAVL是一…

基于 ROS 的Terraform托管服务轻松部署Qwen-VL-Chat

介绍 Qwen-VL是阿里云研发的大规模视觉语言模型&#xff08;Large Vision Language Model&#xff09;。Qwen-VL可以以图像、文本、检测框作为输入&#xff0c;并以文本和检测框作为输出。在Qwen-VL的基础上&#xff0c;利用对齐机制打造出基于大语言模型的视觉AI助手Qwen-VL-…

什么是嵌入式?行业前景如何?

目录 什么是嵌入式&#xff1f; 主要特点 常见应用场景 1. 工业自动化 2. 交通运输 3. 智能家居 4. 消费电子 5. 医疗设备 6. 航空航天 7. 物联网&#xff08;IoT&#xff09; 8. 能源管理 行业前景如何&#xff1f; 市场需求强劲 物联网&#xff08;IoT&#xff09;的爆发 汽车…

vue3的基本使用(步骤,架构模式,调试工具,指令)

1.基本使用步骤 a.导入vue.js的script脚本文件&#xff08;自动为window对象挂载vue构造函数&#xff09; b.在页面中声明一个将要被vue控制的Dom区域 c.创建vue实例对象 <body><div id"app">{{msg}}</div> </body> </html> <s…

树形弹窗选择框/vue2/Element/弹框选择

前言 此类选择器根据vueelementUI实现&#xff0c;使用vue3的可以根据此案例稍作改动即可实现&#xff0c;主要功能有弹出选择、搜索过滤、搜索结果高亮等&#xff0c;此选择器只支持单选&#xff0c;如需多选可在此基础进行改造。 效果图 代码实现 使用时&#xff0c;props-…

文件备份的方法有哪些?应该怎么弄?分享六个高效便捷的电脑文件备份方法

我们的电脑中存储了大量重要文件&#xff0c;如照片、文档、视频以及重要资料等。 然而&#xff0c;面对突如其来的硬件故障、病毒攻击或人为误操作&#xff0c;这些数据仿佛都悬于一线。 虽然说可以选择的恢复方法有很多&#xff0c;但是没有任何一个方法可以做到100%的&…

【Mysql】记录sql在执行过程中很慢

在改之前的测试脚本,之前写了一些sql,这次准备顺手把sql也调整一下,因为虽然sql能用&#xff0c;但是写的十分拉跨 附sql 分析过程: 1. 初步推测慢主要是因为left join了好几张表。 然后我去查了也跟开发求证过sql在执行过程中是"先联表&#xff0c;再执行查询条件"…

SCADA|KingSCADA运行报错:加载网络服务失败

哈喽,你好啊,我是雷工! 今天要运行KingSCADA程序时报错:加载 网络服务失败 ,导致无法运行。 解决问题思路及过程记录如下: 01 问题描述 如下图所示,报加载 网络服务失败 ; 02 处理过程 软件运行信息窗口中会有详细的运行信息,可以先查看软件的信息窗口。 也可以在日…