首页
学习
活动
专区
工具
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的文件。

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

相关·内容

  • 硬件笔记(2)----贴片电容材质NPO与X7R、X5R、Y5V、Z5U的区别

    1、NPO与X7R、X5R、Y5V、Z5U的区别: NPO属于Ⅰ类陶瓷电容器,X7R、X5R、Y5V、Z5U属于Ⅱ类陶瓷电容器。 Ⅰ类陶瓷电容器(ClassⅠceramic capacitor),过去称高频陶瓷电容器(High-frequency ceramic capacitor),介质采用非铁电(顺电)配方,以TiO2为主要成分(介电常数小于150),因此具有最稳定的性能。或者通过添加少量其他(铁电体)氧化物,如CaTiO3或SrTiO3,构成“扩展型”温度补偿陶瓷,则可表现出近似线性的温度系数,介电常数增加至500。这两种介质损耗小、绝缘电阻高、温度特性好。特别适用于振荡器、谐振回路、高频电路中的耦合电容,以及其他要求损耗小和电容量稳定的电路,或用于温度补偿。 Ⅰ类陶瓷的温度容量特性(TCC)非常小,单位往往在ppm/℃,容量较基准值的变化往往远小于1皮法。美国电子工业协会(EIA)标准采用“字母+数字+字母” 这种代码形式来表示Ⅰ类陶瓷温度系数。比如常见的C0G。 C0G代表的温度系数究竟是多少?

    04

    基于事件型表驱动法菜单框架之小熊派简易气体探测器实战项目开发(上)

    这个框架应付一些与按键、LCD交互的案子可以说是非常简单且高效,所以这些年,凡是自己副业或者主业公司做的任何一个项目只要涉及到类似的思想,那么我基本都会沿用这套框架来做,可以说这套框架已经给我挣了不少项目钱了;收获还是蛮大的!Github上还放置了我当时写的PPT,是我当时根据项目大致的需求写的,但是由于产品需求的不确定性,老是变来变去(说实话我真的非常讨厌这样子,以前很讨厌,现在极度讨厌,因为没有明确的需求却还要干着低效率且没有意义的活,简直是浪费资源&&浪费时间&&浪费生命),后面直接舍弃了这个框架,沿用最简单的思维去做,因为可能当事人他自己都不知道要做成什么样子,毕竟没有明确需求的东西不值得提复用性把它做得高逼格,所以只能用简单的思路去做了;简单的框架思维当然就没有这个好,这个PPT也就闲置下来了。当然不同的产品可以根据自己的需求定制修改,这么好用的东西难道不分享?肯定要分享啦!

    02

    AIoT应用创新大赛-植物生长分析仪

    传统的豆芽生长设备,只是完成豆芽的生长过程。相对于其他市面上的自动豆芽生长器,它只是简单的进行循环浇水,保持湿度,保持恒温。然后用遮光布遮光,持续到豆芽长成豆苗。对于豆芽的生长健康状态从不关心。并且如果豆芽死了。它也没有任何反馈。就只能重新种植。本设计豆芽生长状态分析仪主要是跟踪豆芽生长的全过程。可以随时观察豆芽的生长因素参数。将温度,湿度,co2,照度实时进行采集。并绘画成生长曲线。我们将和正常曲线进行对比。如果曲线出现偏差,进行及时报警提醒没有任何状态监控。在生长过程中,如果出现豆芽生长环境因素恶劣情况,经进行报警提醒。同时此仪器可以通过网络告知大家豆芽此刻处于生长阶段的哪个阶段,比如幼苗期,萌芽期等。所以不需要人实时去观察豆芽处于哪个生长阶段。

    04
    领券