1. 程式人生 > >C++入門&影象處理——影象的讀入與讀出

C++入門&影象處理——影象的讀入與讀出

打嘎猴!

前兩天寫了一個非常簡單的小程式,但是出了一個問題卡了很久不知道怎麼解決,是關於圖片讀入那裡的,畢竟新手,現在搞清楚了,來寫篇部落格記錄一下。

首先貼出有錯的程式

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>

int main (int argc, char *argv[])//輸入四個引數,輸出影象名稱,影象寬,影象高,影象深度
{
	FILE *out_YUV=NULL;
	int width=0;
	int height=0;
	int depth=0;
	int i=0;
	int j=0;
	unsigned char *count = NULL;
	

	if(argc!=5)
	{
	printf("input wrong parameter\n");
		return 0;
	}

count = (unsigned char*)malloc(width*height*sizeof(unsigned char));
	memset (count,0 ,width*height*sizeof(unsigned char));

	width = atoi(argv[2]);//atoi作用是把字串轉換成長整型
	height = atoi (argv[3]);
	depth = atoi (argv[4]);
	
	for (j=0;j<=4;j++)
	{
		for (i=0;i<=4;i++)
		{
			count[i] =0;
			count[i+j*10+5] =100;
			count[i+j*10+5*10] =200;
			count[i+j*10+5*10+5] =255;
		}
	}
	
	out_YUV=fopen(argv[1],"wb");
	fwrite(count,sizeof(int),width*height,out_YUV);

	return 0;
}
這是一個將yuv影象分割成四塊,每塊顯示不同灰度的簡單小程式。執行後會報錯,提示說堆已損壞,我從來沒遇到過這個問題,查了很久也想不通,後來諮詢了自家大神,大神給出的修改版如下
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>

int main (int argc, char *argv[])//輸入四個引數,輸出影象名稱,影象寬,影象高,影象深度
{
	FILE *out_YUV=NULL;
	int width=0;
	int height=0;
	int depth=0;
	int i=0;
	int j=0;
	unsigned char *count = NULL;
	

	if(argc!=5)
	{
		printf("input wrong parameter\n");
		return 0;
	}

	width = atoi(argv[2]);//atoi作用是把字串轉換成長整型
	height = atoi (argv[3]);
	depth = atoi (argv[4]);
	count = (unsigned char*)malloc(width*height*sizeof(unsigned char));
	memset (count,0 ,width*height*sizeof(unsigned char));
	
	for (j=0;j<=4;j++)
	{
		for (i=0;i<=4;i++)
		{
			count[i] =0;
			count[i+j*10+5] =100;
			count[i+j*10+5*10] =200;
			count[i+j*10+5*10+5] =255;
		}
	}
	
	out_YUV=fopen(argv[1],"wb");
	fwrite(count,sizeof(int),width*height,out_YUV);

	return 0;
}
可以看出大神只是調整了兩句程式碼的位置。所以我前一篇程式碼的問題出在,我在將引數賦值給寬和高之前就開闢了隨寬高變化的空間並在空間中賦零值,後面也在這個空間中設定灰度值,這樣當然會出錯。

只是一個很小的問題我卻耽誤了很長時間,寫出來希望對其他人有幫助,也提醒自己。

下期見!