# Implementing JPEG Algorithm in Java

```package ajpeg;

import java.io.*;
import java.math.*;

public class Ajpeg {
static double m[][]={{48,39,40,68,60,38,50,121},{149,82,79,101,113,106,27,62},{58,63,77,69,124,107,74,125},{80,97,74,54,59,71,91,66},{18,34,33,46,64,61,32,37},{149,108,80,106,116,61,73,92},{211,233,159,88,107,158,161,109},{212,104,40,44,71,136,113,66}};
static int n[] = new int[64];
static int e1[] = new int[128];

/*
* Flow contol
* */
public static void main(String args[])throws IOException
{
getinput();

System.out.println("\n\n\n Input");
display();

//DCT
System.out.println("\n\n\n On DCT");
dct();
display();

//Quantization
System.out.println("\n\n\n On Quant");
quant();
display();

//zigzag
zigzag();

//entropy
se1();
}

/*
* Get initial input
* */
public static void getinput() throws IOException
{
//System.out.println("Enter input matrix");
// m = new double[8][8];
//for(int i=0;i<8;i++)
//	for(int j=0;j<8;j++)
//	{
//		m[i][j] = Integer.parseInt(obj.readLine());
//	}

}

public static void display(){
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
{
System.out.print(m[i][j] + "\t");
if(j==7){ System.out.println();}
}
}

//DCT
public static void dct()
{
int i,j,u,v;
double res;
double temp[][] = new double[8][8];

//outer
for(u=0;u<8;u++)
{
for(v=0;v<8;v++)
{
res = 0;
//inner
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
res = res + (m[i][j]*Math.cos(Math.PI*(2*i+1)*u/16)*Math.cos(Math.PI*(2*j+1)*v/16));
}
}

res = res * 1/4;

if(u==0)
{
res = res / Math.sqrt(2);
}
else
{
//
}

if(v==0)
{
res = res / Math.sqrt(2);
}
else
{
//
}

temp[u][v] = res;
}
}

m = temp;
}

//Quantization
public static void quant()
{
double qt[][] = {{16,11,12,16,24,40,51,61},{12,12,14,19,26,58,60,55},{14,13,16,24,40,57,69,56},{14,17,22,29,51,87,80,62},{18,22,37,56,68,109,103,77},{24,35,55,64,81,104,113,92},{49,64,78,87,103,121,120,101},{72,92,95,98,112,110,103,99}};
for(int i=0;i<8;i++)
for(int j=0;j<8;j++){
m[i][j]=m[i][j]/qt[i][j];
m[i][j] = Math.round(m[i][j]);
}
}

//zigzag
public static void zigzag()
{
n[0] = (int)m[0][0];
n[1] = (int)m[0][1];
n[2]=(int)m[1][0];
n[3]=(int)m[2][0];
n[4] = (int)m[1][1];
n[5] = (int)m[0][2];
n[6]=(int)m[0][3];
n[7]=(int)m[1][2];
n[8]=(int)m[2][1];
n[9]=(int)m[3][0];
n[10]=(int)m[4][0];
n[11]=(int)m[3][1];
n[12]=(int)m[2][2];
n[13]=(int)m[1][3];
n[14]=(int)m[0][4];
n[15]=(int)m[0][5];
n[16]=(int)m[1][4];
n[17]=(int)m[2][3];
n[18]=(int)m[3][2];
n[19]=(int)m[4][1];
n[20]=(int)m[5][0];
n[21]=(int)m[6][0];
n[22]=(int)m[5][1];
n[23]=(int)m[4][2];
n[24]=(int)m[3][3];
n[25]=(int)m[2][4];
n[26]=(int)m[1][5];
n[27]=(int)m[0][6];
n[28]=(int)m[0][7];
n[29]=(int)m[1][6];
n[30]=(int)m[2][5];
n[31]=(int)m[3][4];
n[32]=(int)m[4][3];
n[33]=(int)m[5][2];
n[34]=(int)m[6][1];
n[35]=(int)m[7][0];
n[36]=(int)m[7][1];
n[37]=(int)m[6][2];
n[38]=(int)m[5][3];
n[39]=(int)m[4][4];
n[40]=(int)m[3][5];
n[41]=(int)m[2][6];
n[42]=(int)m[1][7];
n[43]=(int)m[2][7];
n[44]=(int)m[3][6];
n[45]=(int)m[4][5];
n[46]=(int)m[5][4];
n[47]=(int)m[6][3];
n[48]=(int)m[7][2];
n[49]=(int)m[7][3];
n[50]=(int)m[6][4];
n[51]=(int)m[5][5];
n[52]=(int)m[4][6];
n[53]=(int)m[3][7];
n[54]=(int)m[4][7];
n[55]=(int)m[5][6];
n[56]=(int)m[6][5];
n[57]=(int)m[7][4];
n[58]=(int)m[7][5];
n[59]=(int)m[6][6];
n[60]=(int)m[5][7];
n[61]=(int)m[6][7];
n[62]=(int)m[7][6];
n[63]=(int)m[7][7];

int i;

System.out.println("\n\n\n On zigzag");
for(i=0;i<64;i++)
{
n[i] = Math.abs(n[i]);
System.out.print(n[i]+"\t");
}
}

public static void se1()
{
int i,tp;
StringBuffer op = new StringBuffer();
for(i=0;i<64;i++){
int count =0;
tp = i;
while(i+1<64 && n[i+1]==0){
count++;
i++;
}

//op.append("(");
if(i!=0)
{
//append zero count only for ac
op.append(Integer.toBinaryString(count));
}
//op.append(" ");
//Get the number of bits required to represent that number in binary
op.append(Integer.toBinaryString(Integer.toBinaryString(n[tp]).length()));
//op.append(" ");
//Representing that number in binary
op.append(Integer.toBinaryString(n[tp]));
//op.append(" ");
}
String opt = op.toString();
System.out.println("\n\n\n"+opt);
}
}

/*

run:

Input
48.0	39.0	40.0	68.0	60.0	38.0	50.0	121.0
149.0	82.0	79.0	101.0	113.0	106.0	27.0	62.0
58.0	63.0	77.0	69.0	124.0	107.0	74.0	125.0
80.0	97.0	74.0	54.0	59.0	71.0	91.0	66.0
18.0	34.0	33.0	46.0	64.0	61.0	32.0	37.0
149.0	108.0	80.0	106.0	116.0	61.0	73.0	92.0
211.0	233.0	159.0	88.0	107.0	158.0	161.0	109.0
212.0	104.0	40.0	44.0	71.0	136.0	113.0	66.0

On DCT
699.2499999999999	43.17537783517842	55.2458962644029	72.11192252561607	24.000000000000046	-25.50537751002191	11.211754811037084	-4.1361934819846775
-129.78397283623318	-71.4957835348326	-70.25934416341046	-73.35229687341331	59.432585562295756	-24.0223298746278	22.614760810882366	-2.0506659449800475
85.70740770894031	30.32177947343959	61.776911934581165	44.86638463520262	14.844230984030151	17.348004771994926	15.510407640085607	-13.193489866474044
-40.809000772948515	10.166167106402561	-17.52558849075414	-55.805100649235996	30.50000746240999	-2.279391113997457	-21.002352160175203	-1.256783994741201
-157.49999999999997	-49.39469576644716	13.267753314920942	-1.7801066852396144	-8.749999999999988	22.468610979498212	-8.472261916064841	-9.234812991136668
92.48938318084393	-9.0274872527208	45.72009525326298	-48.1304191876491	-58.505400504935224	-9.012918835424449	-28.5397689145109	10.37937054199913
-53.090043923635406	-62.968866490330015	-3.4895923599144885	-19.62162006305608	56.08886972022844	-2.2530070591154256	-3.2769119345812876	11.912750023395063
-20.538618492594377	-55.90169401863137	-20.586885431597857	-18.190873560968313	-26.57556076417692	-27.068025625951428	8.472705090576747	0.3138030194931717

On Quant
44.0	4.0	5.0	5.0	1.0	-1.0	0.0	0.0
-11.0	-6.0	-5.0	-4.0	2.0	0.0	0.0	0.0
6.0	2.0	4.0	2.0	0.0	0.0	0.0	0.0
-3.0	1.0	-1.0	-2.0	1.0	0.0	0.0	0.0
-9.0	-2.0	0.0	0.0	0.0	0.0	0.0	0.0
4.0	0.0	1.0	-1.0	-1.0	0.0	0.0	0.0
-1.0	-1.0	0.0	0.0	1.0	0.0	0.0	0.0
0.0	-1.0	0.0	0.0	0.0	0.0	0.0	0.0

On zigzag
44	4	11	6	6	5	5	5	2	3	9	1	4	4	1	1	2	2	1	2	4	1	0	0	2	0	0	0	0	0	0	1	0	1	1	0	1	0	1	0	0	0	0	0	0	0	1	0	0	0	1	0	0	0	0	0	0	0	0	0	0	0	0	0

1101011000111000100101101111001111001110101110101110101010010110100100101101110001110001101101010010100110101001110010111101010111011111111111111111110111
BUILD SUCCESSFUL (total time: 0 seconds)

*/
```

This site uses Akismet to reduce spam. Learn how your comment data is processed.