c语言读取jpg字节,给新手个教程吧,用控制台读取图片

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

我们在控制台不能讲RGB都画出来,只能选一个分量来画,就选红色分量来画吧。

还有一点就是,24位2位图储存的像素数据是上下颠倒的,如果你用顺序将文件像素读出来并画出的话就会发现图片上下颠倒了,我们需要注意这一点。还有一个要特别说明,控制台的横向最多能画80个字符,所以我们的位图图片的宽度必须设定为80!!

ok下面开始读取像素并画图

void main()

{

char pix,blank; //pix将存放我们读取出的红色分量数据,blank存放图片的背景颜色。我//们将用第一个读取出来的像素作为背景色,以后只要不是背景色的红色像素我们都画出来

int width,hight; //宽、高

FILE* pi;

pi=fopen("1.bmp","r");

if(pi==NULL) return;

fseek(pi,0x0012,SEEK_SET); //偏移0x0012个字节

fread(&width,sizeof(int),1,pi); //读取宽度

fread(&hight,sizeof(int),1,pi); //读取高度

if(width!=80) printf("图片宽度必须为80\n");

fseek(pi,54,SEEK_SET); //偏移54个字节以后后面就直接是赤裸裸的像素数据了,下面第//一个字节储存的就是第一个像素RGB的R

blank=fgetc(pi); //我们规定第一个读取出来的红色分量就是背景色

for(int i=0;i

{

/*

这里注意一下,因为我们的位图是上下颠倒的,所以第一行的像素在最后一行储存着呢

*/

fseek(pi,54,SEEK_SET); //跳回像素开头

fseek(pi,(hight-i-1)*3*80,SEEK_CUR); //跳过前hight-i-1行的数据

for(int j=0;j<80;++j) //循环宽

{

pix=fgetc(pi);

if(pix==blank) printf(" "); //如果像素为背景色,就画一个空格

else printf("%c",2); //反之画一个笑脸

//注意,我们读取完一个红色后还要跳过两个字节呢,RGB的GB我们不要了

fseek(pi,sizeof(char)*2,SEEK_CUR);

}

}

}

好的,可以使用C语言中的库函数来读取WAV音频文件,并且获取其中的浮点数值。具体步骤如下: 1. 打开WAV文件,可以使用标准IO库中的fopen函数,以"rb"模式打开二进制文件。 2. 读取WAV文件头信息,其中包含有采样率、声道数、每个样本的位数等信息。 3. 根据采样率和位数计算出每个采样值的字节数,在读取每个采样值时,需要按照这个字节数来读取。 4. 将每个采样值转换为浮点数,这可以使用float类型变量来存储,根据每个样本的位数(如16位),将其转换为-1到1之间的浮点数。 5. 输出每个浮点数,可以使用printf函数在控制台输出,或者使用fwrite函数将浮点数写入新的文件中。 下面是一个读取WAV音频文件并输出浮点数的示例代码: ``` #include <stdio.h> #include <stdint.h> typedef struct { uint32_t chunk_id; uint32_t chunk_size; uint32_t format; } wav_header_t; typedef struct { uint32_t subchunk_id; uint32_t subchunk_size; uint16_t audio_format; uint16_t num_channels; uint32_t sample_rate; uint32_t byte_rate; uint16_t block_align; uint16_t bits_per_sample; } wav_format_t; void print_wav_info(wav_header_t* header, wav_format_t* format) { printf("Sample rate: %d Hz\n", format->sample_rate); printf("Channels: %d\n", format->num_channels); printf("Bits per sample: %d\n", format->bits_per_sample); } int main(int argc, char** argv) { if (argc < 2) { printf("Usage: %s <wav file>\n", argv[0]); return 1; } char* filename = argv[1]; FILE* fp = fopen(filename, "rb"); if (!fp) { printf("can't open file %s\n", filename); return 1; } wav_header_t header; fread(&header, sizeof(header), 1, fp); if (header.chunk_id != 0x46464952 || header.format != 0x45564157) { printf("Not a WAV file\n"); return 1; } wav_format_t format; fread(&format, sizeof(format), 1, fp); if (format.subchunk_id != 0x20746D66 || format.audio_format != 1) { printf("Invalid format\n"); return 1; } print_wav_info(&header, &format); // read data chunk uint32_t data_id; fread(&data_id, sizeof(data_id), 1, fp); while (data_id != 0x61746164) { // find data chunk uint32_t data_size; fread(&data_size, sizeof(data_size), 1, fp); fseek(fp, data_size, SEEK_CUR); fread(&data_id, sizeof(data_id), 1, fp); } uint32_t data_size; fread(&data_size, sizeof(data_size), 1, fp); uint32_t num_samples = data_size / (format.bits_per_sample / 8) / format.num_channels; printf("Num samples: %d\n", num_samples); for (uint32_t i = 0; i < num_samples; i++) { int16_t sample[2]; fread(sample, sizeof(sample), 1, fp); float left = (float)sample[0] / 32768; float right = (float)sample[1] / 32768; printf("%f %f\n", left, right); } fclose(fp); return 0; } ``` 注意:这段代码仅仅适用于读取采样位数为16,并且音频文件中只有两个声道的情况,如果需要读取其他格式的音频文件,需要自行修改代码。同时,该段代码不保证完全正确,仅仅作为参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值