将图像降级2倍

时间:2018-02-14 22:46:49

标签: c++ image

我有一个存根来实现。这会将图像降级2倍。输入是输入图像的图像阵列。 output是输出图像的输出数组。 output_height和output_width是输出图像的高度和宽度。降级每个2X2块时,由单个像素替换,其中像素值是2X2块中的最大值。这些数组是行主格式。我的代码如下 -

int input_index_row=0;
int output_index_row=0;
int input_index_column=0;
int output_index_column=0;
//unsigned char max(unsigned char* a,int width)

void print_input(unsigned char*input,int input_width,int input_height)
{
    cout<<"input->"<<endl;
    for(int i=0;i<input_width*input_height;i++)
    {
        if(i%input_width==0)
        {
            cout<<"::::";
        }
        cout<<(int)input[i]<<"-";
    }
    cout<<endl;
}
void print_output(unsigned char*output,int output_width,int output_height)
{
    cout<<"output->"<<endl;
    for(int i=0;i<output_height*output_width;i++)
    {
        cout<<(int)output[i]<<"-";
    }
    cout<<endl;

}


unsigned char* loc(unsigned char*a,int i,int j,int width)
{
    return a+width*i+j;
}


unsigned char max_loc(unsigned char*a,int i,int j,int width)
{
    unsigned char* res=0;
    res=loc(a,i,j,width);
    unsigned char max= *res;
    res=loc(a,i,j+1,width);
    if(max<*res)
    {
        max = *res;
    }
    res= loc(a,i+1,j,width);
    if(max<*res)
    {
        max = *res;
    }
    res= loc(a,i+1,j+1,width);
    if(max<*res)
    {
        max = *res;
    }
    cout<<"max="<<(int)max<<endl;
    return max;
}



void downgrade(unsigned char *input,unsigned char* output,int output_width,int output_height)
{
    /*int output_width=4;
    int output_height= 4;*/

    int input_width=output_width*2;
    int input_height=output_height*2;

    /*unsigned char *input= new unsigned char[input_width*input_height];
    for(unsigned char i=0;i<input_width*input_height;i++) input[i]=i;
    print_input(input,input_width,input_height);

    unsigned char* output = new unsigned char[output_width*output_height];*/
    unsigned char* result;
    while(input_index_row<input_height)
    {
        while(input_index_column<input_width)
        {
            result = loc(output,output_index_row,output_index_column,output_width);
            *result = max_loc(input,input_index_row,input_index_column,input_width);
            input_index_column+=2;
            output_index_column++;
        }
        input_index_row+=2;
        output_index_row++;
        input_index_column=0;
        output_index_column=0;
    }
    cout<<endl;
    print_input(input,input_width,input_height);
    print_output(output, output_width,output_height);
}

但我的输出图像已损坏 这是一个jpeg图像。我需要转换为灰度。

1 个答案:

答案 0 :(得分:-1)

大多数图像格式使用数据压缩来缩小图像的大小。如果图像数据有效,则它应包含一个标题,其中包含有关图像类型及其格式的信息。您需要从标题中确定图像格式,否则您将损坏数据。

以下是.tga文件格式的示例(部分)您可以轻松查找。

enter image description here