📄 file_jpeg_to_image.java
字号:
t2 = s2 * 384;
t3 = s3 * 256;
d3 = t3;
d0 = t0 + t1;
d1 = t0 - t1;
d2 = t2 - t3;
//
s0 = d0 + d3;
s1 = d1 + d2;
s2 = d1 - d2;
s3 = d0 - d3;
s4 = d6 - d4 - d5 - d7;
s5 = d5 - d6 + d7;
s6 = d6 - d7;
s7 = d7;
//
tempA[0][i] = (s0 + s7 + (1 << 12)) >> 13;
tempA[1][i] = (s1 + s6 + (1 << 12)) >> 13;
tempA[2][i] = (s2 + s5 + (1 << 12)) >> 13;
tempA[3][i] = (s3 + s4 + (1 << 12)) >> 13;
tempA[4][i] = (s3 - s4 + (1 << 12)) >> 13;
tempA[5][i] = (s2 - s5 + (1 << 12)) >> 13;
tempA[6][i] = (s1 - s6 + (1 << 12)) >> 13;
tempA[7][i] = (s0 - s7 + (1 << 12)) >> 13;
}
int index = 0;
for (int i = 0; i < 8; i++) {
s0 = tempA[i][0];
s1 = tempA[i][1];
s2 = tempA[i][2] - tempA[i][3];
s3 = tempA[i][3] + tempA[i][2];
s4 = tempA[i][4] - tempA[i][7];
s6 = tempA[i][5] - tempA[i][6];
t0 = tempA[i][5] + tempA[i][6];
t1 = tempA[i][4] + tempA[i][7];
s5 = t0 - t1;
s7 = t0 + t1;
d4 = -s4 * 480 - s6 * 192;
d5 = s5 * 384;
d6 = s6 * 480 - s4 * 192;
d7 = s7 * 256;
t0 = s0 * 256;
t1 = s1 * 256;
t2 = s2 * 384;
t3 = s3 * 256;
d3 = t3;
d0 = t0 + t1;
d1 = t0 - t1;
d2 = t2 - t3;
s0 = d0 + d3;
s1 = d1 + d2;
s2 = d1 - d2;
s3 = d0 - d3;
s4 = d6 - d4 - d5 - d7;
s5 = d5 - d6 + d7;
s6 = d6 - d7;
s7 = d7;
chunkData[index++] = (s0 + s7 + (1 << 12)) >> 13;
chunkData[index++] = (s1 + s6 + (1 << 12)) >> 13;
chunkData[index++] = (s2 + s5 + (1 << 12)) >> 13;
chunkData[index++] = (s3 + s4 + (1 << 12)) >> 13;
chunkData[index++] = (s3 - s4 + (1 << 12)) >> 13;
chunkData[index++] = (s2 - s5 + (1 << 12)) >> 13;
chunkData[index++] = (s1 - s6 + (1 << 12)) >> 13;
chunkData[index++] = (s0 - s7 + (1 << 12)) >> 13;
}
}
int m = 0;
public void decode(byte[] in){
readIndex = 0;
int current, /*m,*/ i, scan_num = 0, RST_num;
int PRED[] = new int[10];
if (in == null) {
return;
}
x = 0;
y = 0;
current = get2Byte(in);
if (current != 0xFFD8) {
return;
}
current = get2Byte(in);
if (par.fileImageToJPG != null) {
Main_Canvas.rotateProcess = 2;
}
while (current == 0xFFC4 || current == 0xFFCC || current >> 4 != 0x0FFC) { //SOF 0~15
switch (current) {
case 0xFFC4:
readHuffmanTable(in);
break;
case 0xFFCC:
return;
case 0xFFDB:
readQualityTable(in);
break;
case 0xFFDD:
FFDDnum = getNum(in);
break;
case 0xFFE0:
case 0xFFE1:
case 0xFFE2:
case 0xFFE3:
case 0xFFE4:
case 0xFFE5:
case 0xFFE6:
case 0xFFE7:
case 0xFFE8:
case 0xFFE9:
case 0xFFEA:
case 0xFFEB:
case 0xFFEC:
case 0xFFED:
case 0xFFEE:
case 0xFFEF:
skipChunk(in);
break;
case 0xFFFE:
skipString(in);
break;
default:
if (current >> 8 != 0xFF) {
return;
}
}
current = get2Byte(in);
}
if (par.fileImageToJPG != null) {
Main_Canvas.rotateProcess = 5;
}
if (current < 0xFFC0 || current > 0xFFC7) {
return;
}
//read frame header
int ti, c;
skip(in, 2);
skip(in, 1);
oriH = get2Byte(in);
oriW = get2Byte(in);
int Nf = getByte(in);
Comp = new ComponentSpec[Nf + 1];
for (i = 0; i <= Nf; i++) {
Comp[i] = new ComponentSpec();
}
for (i = 1; i <= Nf; i++) {
c = getByte(in);
Comp[c].Cid = c;
ti = getByte(in);
Comp[c].smaplingH = ti >> 4;
Comp[c].samplingV = ti & 0x0F;
Comp[c].qTable = getByte(in);
}
//read frame header over
current = get2Byte(in);
if (par.fileImageToJPG != null) {
Main_Canvas.rotateProcess = 6;
}
par.getImageSize(oriW, oriH);
if (par.fileImageToJPG != null) {
Main_Canvas.rotateProcess = 10;
}
do {
while (current != 0x0FFDA) { //SOS
switch (current) {
case 0xFFC4: //DHT
readHuffmanTable(in);
break;
case 0xFFCC: //DAC
return;
case 0xFFDB:
readQualityTable(in);
break;
case 0xFFDD:
FFDDnum = getNum(in);
break;
case 0xFFE0:
case 0xFFE1:
case 0xFFE2:
case 0xFFE3:
case 0xFFE4:
case 0xFFE5:
case 0xFFE6:
case 0xFFE7:
case 0xFFE8:
case 0xFFE9:
case 0xFFEA:
case 0xFFEB:
case 0xFFEC:
case 0xFFED:
case 0xFFEE:
case 0xFFEF:
skipChunk(in);
break;
case 0xFFFE:
skipString(in);
break;
default:
if (current >> 8 != 0xFF) {
return;
}
}
current = get2Byte(in);
}
//read scan JPEG_table
get2Byte(in); //len
scanNum = getByte(in);
int tb;
for (i = 0; i < scanNum; i++) {
int CompN = getByte(in);
quTab[i] = Qtable[Comp[CompN].qTable];
blockNum[i] = Comp[CompN].samplingV * Comp[CompN].smaplingH;
tb = getByte(in);
dcT[i] = HuffmanData[tb >> 4][0];
acT[i] = HuffmanData[tb & 0x0F][1];
}
skip(in, 3);
//read scan JPEG_table over
if (par.fileImageToJPG != null) {
int wChunkNum = oriW / 8 + (oriW % 8 > 0 ? 1 : 0);
int HChunkNum = oriH / 8 + (oriH % 8 > 0 ? 1 : 0);
jpgChunk = new JPGChunkData[wChunkNum * HChunkNum];
for (int a = 0; a < jpgChunk.length; a++) {
jpgChunk[a] = new JPGChunkData();
}
}
scan_num++;
m = 0;
int Mnum;
int temp[] = new int[1]; // to store remainded bits
int index[] = new int[1];
for (RST_num = 0;; RST_num++) { //Decode one scan
Mnum = 0;
temp[0] = 0;
index[0] = 0;
for (i = 0; i < 10; i++) {
PRED[i] = 0;
}
if (FFDDnum == 0) {
current = getDUArray(in, PRED, temp, index);
// System.out.println("m: "+m+" current: "+current);
while (current == 0) {
m++;
if (par.fileImageToJPG != null) {
if(par.par.rotateDir == -1)return;
outputAndEncode();
} else {
outputPixel();
}
current = getDUArray(in, PRED, temp, index);
// if(m == 3750)
// System.out.println("m: "+m+" current: "+current);
}
break; //current=MARKER
}
for (Mnum = 0; Mnum < FFDDnum; Mnum++) {
current = getDUArray(in, PRED, temp, index);
if (par.fileImageToJPG != null) {
if(par.par.rotateDir == -1)return;
outputAndEncode();
} else {
outputPixel();
}
//fprintf(show,"%i ",MCU_num);
if (current != 0) {
break;
}
}
if (current == 0) {
if (markNumI != 0) {
current = (0xFF00 | markNum);
markNumI = 0;
} else {
current = get2Byte(in);
}
}
if (current >= 0xFFD0 && current <= 0xFFD7) {
} else {
break;
} //current=MARKER
}
if (current == 0xFFDC && scan_num == 1) { //DNL
getNum(in);
current = get2Byte(in);
}
} while (current != 0xFFD9);
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// int tempyuv[] = new int[3];
// for(int a=0; a<jpgChunk.length; a++){
// if(a== 0 || a == 1){
// System.out.print("Y_D: ");
// for(int j=0;j<64;j++){
// System.out.print(jpgChunk[a].Y_D[j]+" ");
// }
// System.out.println("");
// System.out.print("U_D: ");
// for(int j=0;j<64;j++){
// System.out.print(jpgChunk[a].U_D[j]+" ");
// }
// System.out.println("");
// System.out.print("V_D: ");
// for(int j=0;j<64;j++){
// System.out.print(jpgChunk[a].V_D[j]+" ");
// }
// System.out.println("");
// System.out.print("last DC_YUV: ");
// for(int j=0;j<3;j++){
// System.out.print(tempyuv[j]+" ");
// }
// System.out.println("");
// }
// par.fileImageToJPG.doEncode(baos, jpgChunk[a].Y_D, jpgChunk[a].U_D, jpgChunk[a].V_D, tempyuv, (a==1?true:false));
// if(a== 0 || a == 1){
// System.out.print("DC_YUV: ");
// for(int j=0;j<3;j++){
// System.out.print(tempyuv[j]+" ");
// }
// System.out.println("");
// }
// if(a < par.fileImageToJPG.chunkData.length){
// par.fileImageToJPG.chunkData[a] = baos.toByteArray();
// if(a== 0 || a == 1){
// System.out.print("chunkData: ");
// for(int j=0;j<par.fileImageToJPG.chunkData[a].length;j++){
// System.out.print(par.fileImageToJPG.chunkData[a][j]+" ");
// }
// System.out.println("");
// }
// baos.reset();
// }
// if(a < jpgChunk.length-1){
// for(int b=0;b<3;b++){
// tempyuv[b] = jpgChunk[a].DC_YUV[b];
// }
// }
// }
// for(int a = 0;a<testInt.length;a++){
// System.out.print("("+a+"): ");
// for(int b=0;b<3;b++){
// System.out.print(testInt[a][b]+" ");
// }
// System.out.println("");
// }
// for(int j=0;j<par.fileImageToJPG.chunkData.length;j++){
// System.out.print("j: ");
// for(int t=0;t<par.fileImageToJPG.chunkData[j].length;t++){
// System.out.print(par.fileImageToJPG.chunkData[j][t]+" ");
// }
// System.out.println("");
// }
// System.out.println("chunkCount = "+chunkCount);
}
}
class ComponentSpec {
public int Cid;
public int smaplingH;
public int samplingV;
public int qTable;
}
class JPGChunkData {
int YDU[];
int UDU[];
int VDU[];
int DC_YUV[] = new int[3];
boolean hasDCYUV = false;
public void clear() {
YDU = null;
UDU = null;
VDU = null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -