首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C中裁剪.ppm文件

在C语言中,裁剪.ppm文件通常涉及到图像处理和文件操作。.ppm文件是一种图像文件格式,用于存储矩阵形式的图像数据。以下是一个简单的示例,展示了如何在C语言中裁剪.ppm文件:

代码语言:c
复制
#include<stdio.h>
#include <stdlib.h>
#include<string.h>

#define MAX_COMMENT_LENGTH 70
#define MAX_LINE_LENGTH 70

typedef struct {
    int width;
    int height;
    int max_color_value;
    char comment[MAX_COMMENT_LENGTH + 1];
    unsigned char *pixels;
} PPMImage;

void read_ppm_header(FILE *file, PPMImage *image) {
    char line[MAX_LINE_LENGTH + 1];
    fgets(line, MAX_LINE_LENGTH + 1, file);
    if (strcmp(line, "P6\n") != 0) {
        fprintf(stderr, "Error: Invalid PPM file format.\n");
        exit(1);
    }

    fgets(line, MAX_LINE_LENGTH + 1, file);
    sscanf(line, "%d %d\n", &image->width, &image->height);

    fgets(line, MAX_LINE_LENGTH + 1, file);
    sscanf(line, "%d\n", &image->max_color_value);

    fgets(line, MAX_LINE_LENGTH + 1, file);
    strncpy(image->comment, line, MAX_COMMENT_LENGTH);
    image->comment[MAX_COMMENT_LENGTH] = '\0';
}

PPMImage *read_ppm_image(const char *filename) {
    FILE *file = fopen(filename, "rb");
    if (file == NULL) {
        fprintf(stderr, "Error: Cannot open file %s.\n", filename);
        exit(1);
    }

    PPMImage *image = (PPMImage *)malloc(sizeof(PPMImage));
    read_ppm_header(file, image);

    int pixel_count = image->width * image->height;
    image->pixels = (unsigned char *)malloc(pixel_count * 3);
    fread(image->pixels, 1, pixel_count * 3, file);

    fclose(file);
    return image;
}

void write_ppm_image(const char *filename, PPMImage *image) {
    FILE *file = fopen(filename, "wb");
    if (file == NULL) {
        fprintf(stderr, "Error: Cannot open file %s.\n", filename);
        exit(1);
    }

    fprintf(file, "P6\n");
    fprintf(file, "%d %d\n", image->width, image->height);
    fprintf(file, "%d\n", image->max_color_value);
    fprintf(file, "%s", image->comment);

    int pixel_count = image->width * image->height;
    fwrite(image->pixels, 1, pixel_count * 3, file);

    fclose(file);
}

void crop_ppm_image(PPMImage *image, int x, int y, int width, int height) {
    unsigned char *cropped_pixels = (unsigned char *)malloc(width * height * 3);
    int src_row_stride = image->width * 3;
    int dst_row_stride = width * 3;

    for (int i = 0; i< height; i++) {
        memcpy(cropped_pixels + i * dst_row_stride,
               image->pixels + (y + i) * src_row_stride + x * 3,
               width * 3);
    }

    free(image->pixels);
    image->pixels = cropped_pixels;
    image->width = width;
    image->height = height;
}

int main() {
    PPMImage *image = read_ppm_image("input.ppm");
    crop_ppm_image(image, 10, 10, 100, 100);
    write_ppm_image("output.ppm", image);
    free(image->pixels);
    free(image);
    return 0;
}

这个示例代码包含了读取.ppm文件、裁剪.ppm文件和写入.ppm文件的功能。在main函数中,我们首先读取一个名为input.ppm的.ppm文件,然后裁剪它,最后将裁剪后的图像写入一个名为output.ppm的文件。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

全志Tina Linux 系统裁剪 boot0裁剪 uboot裁剪 内核裁剪 文件系统裁剪 C裁剪 文件系统压缩

系统经过裁剪过后,通常也会提升启动速度以及减少内存占用。 本文介绍TinaLinux系统裁剪的方法,为有裁剪需求的使用者提供参考。...2 Tina系统裁剪简介 Tina固件通常包含boot0、uboot、kernel、rootfs等镜像。...2.2 uboot裁剪 目前tina环境中有不同版本的uboot,分别存在两个不同的文件路径,以实际sdk的目录为准,cboot可以进入到相应的uoot目录,这两个路径分别为lichee/brandy...Tina,集成了CONFIG_REDUCE_KERNEL_SIZE宏。...2.4.1 应用程序及冗余文件裁剪 不影响整体功能的情况下,一些应用程序或冗余文件往往可以删除: 调试工具。比如tcpdump、mpstat、strace等等。 性能测试工具。

8.6K20

制作NC掩膜文件python裁剪全球数据

01 背景与思路 对全球数据掩膜的重要性 鉴于很多数据如CRU、GLDAS、TerraClimate、GLASS数据等都是全球NC数据,如何利用Python对这些数据进行裁剪,得到属于自己研究区范围的数据一直困扰着许多人...SHP文件、世界国家SHP文件,利用ARCGIS10.2软件完成下列操作 ?...世界国家和研究区shp文件 ? ? 研究区展示 03 矢量文件融合与拼接 1.分别将世界国家和研究区的shp文件进行融合,得到整个世界和研究区的面Shp。 ? 点击Edior开始编辑 ?...Editor找到Merge进行融合 ? ? 融合结果展示 2.将融合后的世界国家和研究区面矢量进行拼接至一个文件。 ? 工具箱打开General-Append ?...选择需要转化的变量 这样研究区为1,全球为0的NC文件就制作好了,其中还有很多细节,需要自己动手去发现,python计算中使用np.multiply将掩膜NC与全球数据相乘,再利用一些if判断,获取研究区边界内的方形格网

5.9K21
  • C++调用Python

    这篇文章我们要介绍的是一个比较特殊的场景——用C++的代码去调用Python函数实现的一些功能。...VS Code配置 这里我们使用的IDE是VS Code,但是上述提到的几个路径,VS Code默认是不被包含的,因此代码编辑的过程include 这一步就会报错了。...首先在VS Code界面上按顺序同时按住:ctrl+shift+P,弹出的窗口中输入C/C++ Edit Configurations(JSON)查找相关JSON配置文件列表中点击后会自动VS...调用Python函数string.split() C++如果我们想分割一个字符串,虽然说也是可以实现的,但是应该没有比Python执行一个string.split()更加方便快捷的方案了,因此我们测试一个用...但是我们同时借助于PyRun_SimpleString调用了Python的os库,执行了一个查看路径和当前路径下文件的功能,我们发现这个C++文件和需要引入的pysplit.py其实是同一个路径下的

    4K30

    C++fstream_使用

    C++处理文件类似于处理标准输入和标准输出。类ifstream、ofstream和fstream分别从类 istream、ostream和iostream派生而来。...对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。...被打开的文件程序由一个流对象(stream object)来表示 (这些类的一个实例) ,而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。...:in 以输入(读)方式打开文件; ios::out 以输出(写)方式打开文件; ios::ate 初始位置:文件尾,文件打开后定位到文件尾; ios::app 以追加的方式打开文件,所有输出附加在文件末尾...http://www.cplusplus.com/reference/fstream/fstream/列出了fstream可以使用的成员函数。

    5.5K10

    Lua调用C语言

    函数lua_pushcfunction会获取一个指向C函数的指针,然后Lua创建一个”function”类型,代表待注册的函数。一旦完成注册,C函数就可以像其他Lua函数一样行事了。...在打开目录后,该函数会创建一张新表,然后用目录的元素填充这张新表。最后,该函数关闭目录并返回1,C语言中即表示该函数将其栈顶的值返回给了Lua。...除了C函数的定义外,C模块还必须定义一个特殊的函数,这个特殊的函数相当于Lua库的主代码段,用于注册模块中所有的C函数,并将它们存储恰当的地方。...通常,一个C模块只有一个用于打开库的公共函数;其他所有的函数都是私有的,C语言中被声明为static。 当我们使用C函数来扩展Lua程序时,将代码设计为一个C模块是个不错的想法。...一个简答的做法是把luaopen_mylib添加到由lua_openlibs打开的标住库列表,这个列表位于文件linit.c

    3.9K20

    c++的.hpp文件

    而实现代码将直接编译到调用者的obj文件,不再生成单独的obj,采用hpp将大幅度减少调用 project的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库...2、与*.h类似,hpp是C++程序头文件 。3、是VCL 专用的头文件,已预编译。4、是一般模板类的头文件。...*.hpp要注意的问题有: a)不可包含全局对象和全局函数 由于hpp本质上是作为.h被调用者include,所以当hpp文件存在全局对象或者全局函数,而该hpp被多个调用者include...b)类之间不可循环调用 .h和.cpp的场景,当两个类或者多个类之间有循环调用关系时,只要预先在头文件做被调用类的声明即可,  c)不可使用静态成员 静态成员的使用限制在于如果类含有静态成员...唯 一的例外是const static整型成员,因为vs2003,该类型允许定义时初始化,如:

    2.1K10

    Linux 重命名文件的所有文件

    Linux系统,有时候我们需要批量重命名文件的所有文件,以便更好地组织和管理文件。本文将详细介绍几种Linux重命名文件夹中所有文件的方法,包括使用命令行工具和脚本等方式。...执行mv命令之前,可以先执行一个测试命令来确认重命名操作是否符合预期。ls -l这将列出文件文件,并显示它们的详细信息。确保重命名操作没有出现错误,并且文件名已按预期修改。执行重命名操作。...然后,终端运行以下命令来执行脚本:bash rename_script.sh脚本将遍历文件的所有文件,检查文件的扩展名是否为.txt,如果是,则将其重命名为.md。...结语通过使用mv命令、rename命令和脚本,我们可以Linux轻松地重命名文件的所有文件。本文详细介绍了三种常用的方法,包括使用mv命令、rename命令和编写脚本来实现批量重命名操作。...使用mv命令可以直接在命令行执行简单的重命名操作,适用于简单的文件名修改。通过结合通配符和新旧文件名模式,我们可以轻松地重命名文件的所有文件

    4.7K40

    C++ 命名 Mangling 和 extern “C

    不支持函数重载,因此,当我们 C++ 链接 C 代码时,我们必须确保符号的名称不被更改。...从 C++ 链接时如何处理 C 符号? C ,名称可能不会被修改,因为它不支持函数重载。那么当我们 C++ 链接 C 代码时,如何确保符号的名称不被更改。...解决方案:  C++ 的 Extern “C” 当一些代码被放入 extern “C” 块时,C++ 编译器确保函数名是未修改的——编译器发出一个名称不变的二进制文件,就像 C 编译器会做的那样。...main() { printf("haiyong"); return 0; } 输出 haiyong 因此,所有 C 风格的头文件(stdio.h、string.h 等) extern...由于 C++ 支持函数重载,因此必须在函数名称添加附加信息(称为 Name mangling)以避免二进制代码的冲突。  2.  C 不能更改函数名称,因为它不支持函数重载。

    1.2K40

    C++尝鲜:C++实现​​​LINQ!

    导语 | 正式分析libunifex之前,我们需要了解一部分它依赖的基础机制,方便我们更容易的理解它的实现。...没错,c++的linq就是c++下实现类似C# linq的机制,本身其实就是定义一个特殊的DSL,相关的机制已经被使用在c++20的ranges库,以及不知道何时会正式推出的execution库,...c++里也能有linq? 为什么这种表达虽然其他语言常见, c++里存在却显得有点格格不入?...二、特殊的DSL实现 其实本质上来说, 这种实现很巧妙的利用了部分compiler time的特性,最终c++实现了一个从“代码->Compiler->Runtime”的一个DSL,后续我们也介绍到...: _Pipeline{static_cast(*this), static_cast(__r)}; 四、总结 本篇我们简单介绍了c++ linq

    1.9K10
    领券