#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");
}
}
}
202212-3 JPEG解码
最新推荐文章于 2024-07-25 10:17:46 发布