日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

LinuxC语言简单实现图片加马赛克-标准IO实现

發布時間:2024/1/8 linux 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LinuxC语言简单实现图片加马赛克-标准IO实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 基于C語言實現,標準IO練習
2. 圖片格式bmp
BMP圖片格式詳解
(獲取圖片前54個字節中有用的信息鏈接)
3. 代碼實現

//標準IO實現 #include <stdio.h> // Shift + Alt + F 實現代碼的對齊; // malloc函數的頭文件 #include <stdlib.h>//圖片的參數結構體 單位Bytes typedef struct {unsigned int img_size; //圖片的大小unsigned int img_width; //圖片的寬unsigned int img_high; //圖片的高unsigned short img_bitcount; //一個像素點占用的bit(24bit)當biBitCount=24時,1個像素占3個字節; } image_info_t;// RGB顏色參數 typedef struct {unsigned char b; // Bunsigned char g; // Gunsigned char r; // R } point_t;/*//地址傳遞 void show_image_info(image_info_t *info) { //向終端打印圖片參數printf("大小size = %d,寬width = %d,高high = %d,素點占bitcount = %d\n",info->img_size, info->img_width, info->img_high, info->img_bitcount); }*///值傳遞 void show_image_info(image_info_t info) {//向終端打印圖片參數printf("大小size = %d,寬width = %d,高high = %d,素點占bitcount = %d\n",info.img_size, info.img_width, info.img_high, info.img_bitcount); }void get_image_info(FILE *fp, image_info_t *info) {//修改光標的位置fseek(fp, 2, SEEK_SET); //從文件的開頭向后偏移2個字節fread(&info->img_size, 1, 4, fp); //圖片的大小fseek(fp, 18, SEEK_SET); // biWidth = biSize:002h+4Bytes + 012hfread(&info->img_width, 1, 4, fp); //圖片的寬// biHeight = biSize:002h+4Bytes + biWidth:012h+4Bytes = 22// fseek(fp, 22, SEEK_SET);//緊接著,無需修改光標的位置也可繼續讀fread(&info->img_high, 1, 4, fp); //讀取圖片的高// biSizeImage=biSize:002h+4Bytes + 022h= 28 此時上面執行完后在 26 (從文件的開頭向后偏移26個字節)//還需要 從光標當前位置向后偏移2個字節fseek(fp, 2, SEEK_CUR); //<==>fseek(fp, 28, SEEK_SET); 從文件的開頭向后偏移28個字節fread(&info->img_bitcount, 1, 2, fp); //像素點占用的bit }void copy_image_file(FILE *sfp, FILE *dfp) {int ret;char buf[1024] = {0};/*成功返回讀取到的項目的個數,如果是失敗或者讀取到的文件的結尾返回值是要小于nnemb或者0讀取到文件的結尾需要通過feof(fp)或者錯誤通過ferror(fp)來判斷*/while (!(feof(sfp) || ferror(sfp))){// fread(保存讀取到數據的首地址,每一項的大小, 項的個數,文件指針);成功返回讀取到的項目的個數ret = fread(buf, 1, sizeof(buf), sfp);// fwrite(數據的首地址,每一項的大小, 項的個數,文件指針);成功返回寫入的項目的個數fwrite(buf, 1, ret, dfp);}return; } void set_image_mosaic(FILE *fp, image_info_t *info, int x, int y) {int i, j, k, w;point_t color = {0, 0, 0xff}; //{B,G,R}//保存讀取到的數據char *buffer = (char *)malloc((info->img_width) * (info->img_high) * 3);// 1.將圖像讀取回來 (跳過圖片的文件頭、信息頭)54Bytefseek(fp, 54, SEEK_SET);fread(buffer, 1, (info->img_size - 54), fp);// 2.修改buffer//傳入 x y// i:整體的高/10 (共有行數)for (i = 0; i < info->img_high / y; i++){// j:整體的寬除以10 (共有列數)for (j = 0; j < info->img_width / x; j++){//讀取小方塊中最左上角的像素點 //當biBitCount=24時,1個像素占3個字節;color = *(point_t *)(buffer + (j * 3 * x) + (i * y * info->img_width * 3));// k:小方塊的高(行)for (k = 0; k < y; k++){// w:小方塊的寬(列)for (w = 0; w < x; w++){//將小方塊的各個像素賦值==最左上角的像素點//當biBitCount=24時,1個像素占3個字節;*(point_t *)(buffer + w * 3 + (k * info->img_width * 3) +(j * 3 * x) + (i * y * info->img_width * 3)) = color;}}}}// 3.重新將圖像寫回去fseek(fp, 54, SEEK_SET); //修改光標的位置回到原位fwrite(buffer, 1, (info->img_size - 54), fp);//釋放地址空間的free(buffer); } int main(int argc, char const *argv[]) {FILE *sfp, *dfp;int size;image_info_t info; //圖片的參數結構體char new_name[20] = {0};if (argc != 2){ //命令行輸入./a.out xxxx.bmpfprintf(stderr, "input error,try again\n");fprintf(stderr, "usage:./a.out xxxx.bmp\n");return -1;}// 1.打開文件并拷貝文件 milaoshu.bmpif ((sfp = fopen(argv[1], "r")) == NULL){perror("open error");return -1;}//構造一個新圖片的字符串 new_milaoshu.bmpsnprintf(new_name, sizeof(new_name), "new_%s", argv[1]);//存放首地址 格式化的控制格式//打開新圖片,如果不存在就創建,如果存在就清空if ((dfp = fopen(new_name, "w+")) == NULL) // w+ 讀寫{perror("open error");return -1;}//圖片的拷貝,將milaoshu.bmp-->new_milaoshu.bmpcopy_image_file(sfp, dfp);// 2.獲取圖片前54個字節中有用的信息get_image_info(dfp, &info); //傳地址直接修改賦值// show_image_info(&info);//地址傳遞show_image_info(info); //值傳遞// 3.嘗試打馬賽克// 10,10:代表的是打馬賽克每個小方塊的大小// 10*3= 30// 10 = 10行set_image_mosaic(dfp, &info, 10, 10);// 4.關閉源文件和目標文件fclose(sfp);fclose(dfp);return 0; }

4. 執行

5. 對比

6. 非原創

總結

以上是生活随笔為你收集整理的LinuxC语言简单实现图片加马赛克-标准IO实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。