#include <stdio.h>
#include <stdlib.h>
#include "Read_pic.h"
#include "string.h"
int clamp_s (int value,int m_min,int m_max)
{
int mm_ret = value;
if(value <m_min )
{
mm_ret = m_min ;
}
if(value > m_max)
{
mm_ret = m_min;
}
return mm_ret;
}
int DoubleInterplotion(unsigned char* srcImage, unsigned char * desImage, int srcW, int srcH, int destW, int destH, int channels)
{
float ratioW = 0.0f;
float ratioH = 0.0f;
int i = 0;
int j = 0;
int k = 0;
ratioW = srcW * 1.0f / destW;
ratioH = srcH * 1.0f / destH;
for ( i = 0; i < destH; i++)
{
for(j = 0; j < destW; j ++ )
{
int srcIdx = 0;
int srcIdy = 0;
float srcfIdx = 0.0f;
float srcfIdy = 0.0f;
float weightX[2] ={0.0f};
float weightY[2] ={0.0f};
srcfIdx = j * ratioW ;
srcfIdy = i * ratioH ;
srcIdx =(int)(srcfIdx);
srcIdy =(int)(srcfIdy);
weightX[1] = srcfIdx - srcIdx;
weightX[0] = 1.0f - weightX[1];
weightY[1] = srcfIdy - srcIdy;
weightY[0] = 1.0f - weightY[1];
for(k=0;k < channels ; k ++)
{
desImage[(i * destW + j ) * channels + k]=
(srcImage[(srcIdy * srcW + srcIdx ) * channels+ k] * weightX[0]+
srcImage[(srcIdy * srcW + clamp_s(srcIdx + 1, 0, srcW - 1)) *channels + k] * weightX[1]) * weightY[0] +
(srcImage[(clamp_s(srcIdy + 1, 0, srcH - 1) * srcW + srcIdx) * channels + k] * weightX[0] +
srcImage[(clamp_s(srcIdy + 1, 0, srcH - 1) * srcW + clamp_s(srcIdx + 1, 0, srcW - 1)) * channels + k] * weightX[1]) * weightY[1];
}
}
}
return 0;
}
int gray(int srcH, int srcW, unsigned char * prtRGBA, unsigned char * graybuffer)
{
int i = 0;
int j = 0;
for(i = 0;i <srcH; i ++)
{
for(j = 0; j < srcW; j ++)
{
unsigned char g = prtRGBA[4 * (i * srcW + j) + 0];
unsigned char r = prtRGBA[4 * (i * srcW + j) + 1];
unsigned char b = prtRGBA[4 * (i * srcW + j) + 2];
unsigned char a = prtRGBA[4 * (i * srcW + j) + 3];
graybuffer[(i * srcW + j) * 4 + 0] = r * 0.299 + g * 0.587 + b * 0.114;
graybuffer[(i * srcW + j) * 4 + 1] = r * 0.299 + g * 0.587 + b * 0.114;
graybuffer[(i * srcW + j) * 4 + 2] = r * 0.299 + g * 0.587 + b * 0.114;
graybuffer[(i * srcH + j) * 4 + 3] = r * 0.299 + g * 0.587 + b * 0.114;
}
}
return 0;
}
static int Rotation180Right(unsigned char * src, unsigned char * des, int srcW, int srcH, int channel)
{
int i = 0;
int j = 0;
int k = 0;
unsigned char temp = (unsigned char)0;
for(i = 0; i <=srcH-1 ; i ++)
{
for(j = 0; j <= srcW -1; j ++)
{
for(k = 0; k < channel; k ++)
{
temp = src[(i * srcW + j) * channel + k];
des[((srcH-1-i)*srcW +(srcW-1-j))* channel + k]=temp;
}
}
}
return 0;
}
int main()
{
IMAGE img;
IMAGE newImage;
unsigned char * out= NULL;
unsigned char * des = NULL;
unsigned char * temp= NULL;
LoadBMP("hello.bmp", &img, BIT32);
des = (unsigned char *)malloc(sizeof(unsigned char) * img.height * img.width * img.channels);
out = (unsigned char *)malloc(sizeof(unsigned char ) * img.width * img.height * img.channels);
temp= (unsigned char *)malloc(sizeof(unsigned char ) * 100 * 80 * 4);
gray(img.height, img.width, img.data, out);
DoubleInterplotion(img.data, temp, img.width, img.height, 100, 80, 4);
newImage.data = temp;
newImage.width = 100;
newImage.height = 80;
newImage.channels = img.channels;
WriteBMP("00311.bmp", &newImage,BIT32);
freeImage(&img);
printf("\n\n\n\n\n\n\n 图像生成并保存了!!\n ");
system("pause");
return 0;
}