(新人练习,仅供参考)
import java.util.Scanner;
public class Main {
static int[][]M;
static int[][]M1;//M变换后
static int []data;
static int n;
public static void main(String[]args){//JPEG解码
Scanner in=new Scanner(System.in);
int[][]Q=new int[8][8];//步骤1,读入量化矩阵
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
Q[i][j]=in.nextInt();
}
}
n=in.nextInt();//扫描数据的个数
int T=in.nextInt();//0/1/2
data=new int[n];//扫描数据
for (int i = 0; i < n; i++) {
data[i]=in.nextInt();
}
M=new int[8][8];//步骤2,初始化M矩阵
M1=new int[8][8];
Third();//步骤3,填充数据
if (T==0){
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
System.out.print(M[i][j]+" ");
}
System.out.println();
}
return;
}
//步骤4,将矩阵M中的每个元素都乘以量化矩阵Q中的对应元素。
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
M[i][j]*=Q[i][j];
}
}
if (T==1){
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
System.out.print(M[i][j]+" ");
}
System.out.println();
}
return;
}
Fifth();//步骤5,对矩阵M进行变换+步骤6
if(T==2){
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
System.out.print(M1[i][j]+" ");
}
System.out.println();
}
}
}
static public void Third(){//步骤3,填充数据
int i=0,j=0;//填充开始坐标
int dir=0;//填充方向,dir=0,右上;dir=1,左下
for (int k = 0; k <n; k++) {
M[i][j]=data[k];
if (dir==0){//右上填充
i--;
j++;
if (i<0||j>7){
if (i<0&&j<=7){
i+=1;
dir=1;
}else if (i>=0){
i+=2;
j-=1;
dir=1;
}else {
i+=1;
j-=1;
dir=1;
}
}
continue;
}
if (dir==1){//左下填充
i++;
j--;
if (i>7||j<0){
if (i>7&&j>=0){
i--;
j+=2;
dir=0;
}else if (i<=7){
j++;
dir=0;
}else {
i--;
j+=2;
dir=0;
}
}
}
}
}
static public void Fifth(){//步骤5,对矩阵M进行变换+步骤6
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
double res=0;
double a1,a2;
for (int u = 0; u < 8; u++) {
a1=(u==0?Math.sqrt(0.5):1);
for (int v = 0; v <8; v++) {
a2=(v==0?Math.sqrt(0.5):1);
res+=a1*a2*M[u][v]*Math.cos((i+0.5)*Math.PI*u/8)*Math.cos((j+0.5)*Math.PI*v/8);
}
}
int res1=(int)Math.round(res/4+128);
if (res1>255)res1=255;
if (res1<0)res1=0;
M1[i][j]=res1;
}
}
}
}