202212-3 JPEG解码

#include <iostream>
#include <cmath>
using namespace std;

int main(){
    int Q[8][8];
    //初始化量化矩阵
    for(int i = 0;i < 8;i++){
        for(int j = 0;j < 8;j++){
            scanf("%d",&Q[i][j]);
        }
    }
    long long M[8][8];
    double M2[8][8];
    //初始化扫描矩阵
    for(int i = 0;i < 8;i++){
        for(int j = 0;j < 8;j++){
            M[i][j] = 0;
            M2[i][j] = 0;
        }
    }
    int n,T;
    scanf("%d%d",&n,&T);

    int inputValu[70];//表示读入数据
    for(int i = 0;i < 70;i++){
        inputValu[i] = 0;
    }
    for(int i = 0;i < n;i++){
        scanf("%d",&inputValu[i]);
    }
    //不知道为什么这里用前几年的Z扫描不行
    int idx[8][8] = {{0,  1,  5,  6,  14, 15, 27, 28},
                     {2,  4,  7,  13, 16, 26, 29, 42},
                     {3,  8,  12, 17, 25, 30, 41, 43},
                     {9,  11, 18, 24, 31, 40, 44, 53},
                     {10, 19, 23, 32, 39, 45, 52, 54},
                     {20, 22, 33, 38, 46, 51, 55, 60},
                     {21, 34, 37, 47, 50, 56, 59, 61},
                     {35, 36, 48, 49, 57, 58, 62, 63}};
    for(int i = 0;i < 8;i++){
        for(int j = 0;j < 8;j++){
            M[i][j] = inputValu[idx[i][j]];
        }
    }
    if(T == 0){
        for(int i = 0;i < 8;i++){
            for(int j = 0;j < 8;j++){
                printf("%lld ",M[i][j]);
            }
            printf("\n");
        }
    }else if(T == 1){
        for(int i = 0;i < 8;i++){
            for(int j = 0;j < 8;j++){
                M[i][j] = M[i][j]*Q[i][j];
                printf("%lld ",M[i][j]);
            }
            printf("\n");
        }
    }else{
        for(int i = 0;i < 8;i++){
            for(int j = 0;j < 8;j++){
                M[i][j] = M[i][j]*Q[i][j];
            }
        }
        double a = sqrt(0.5);
        double result = 0;
        for(int i = 0;i < 8;i++){
            for(int j = 0;j < 8;j++){
                double add = 0;
                for(int u = 0;u < 8;u++){
                    for(int v = 0;v < 8;v++){
                        if(u==0&&v==0){
                            result = 0.5 * M[u][v] * cos(acos(-1)*0.125*(i+0.5)*u) * cos(acos(-1)*0.125*(j+0.5)*v);
                        }else if(u==0&&v!=0 || u!=0&&v==0){
                            result = a * M[u][v] * cos(acos(-1)*0.125*(i+0.5)*u) * cos(acos(-1)*0.125*(j+0.5)*v);
                        }else{
                            result = M[u][v] * cos(acos(-1)*0.125*(i+0.5)*u) * cos(acos(-1)*0.125*(j+0.5)*v);
                        }
                        add += result;
                    }
                }
                add = 0.25 * add;
                M2[i][j] = add;
            }
        }
        for(int i = 0;i < 8;i++){
            for(int j = 0;j < 8;j++){
                M2[i][j] += 128;
                M2[i][j] = round(M2[i][j]);
                if(M2[i][j] > 255){
                    M2[i][j] = 255;
                }
                if(M2[i][j] < 0){
                    M2[i][j] = 0;
                }
                printf("%.0f ",M2[i][j]);
            }
            printf("\n");
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值