gpt4 book ai didi

java - JPEG如何在解码文件流时跳过用户定义的标签

转载 作者:太空宇宙 更新时间:2023-11-04 10:27:53 27 4
gpt4 key购买 nike

public ArrayList DCTread(char[] im,int flag,int select, int DC0,int row,int col){
//Input:im is the binary sequence of the host image. I wrote a "byte2char" function to convert that. flag serves as an outside pointer to locate the to-be-decoded chars. DC0 is the DC coeff for the last block.And row,col is simply for debug.
//Main Output:An ArrayList that contains the DCT coeffs,pointer(an int showing how many bits are read in this function)
String rev=new String();char[] DCcode;
ArrayList res = new ArrayList(2);int[][] ac = null; int[][] dc = null;int[][] coeff = new int[8][8];int pointer = 0;
int[] ans;int wordLen;int zeroLen;int diff;int ACnum = 1;int dct;
switch(select){//determine using which two huffman trees.
case(0):ac = a0;dc = d0;break;
case(1):ac = a1;dc = d0;break;
case(16):ac = a0;dc = d1;break;
case(17):ac = a1;dc = d1;break;
}
//DC
ans = T.huffmanDecoder(im,pointer+flag,dc,row,col);
if(ans[0]==-1){
int a1 = T.bin2dec_str(im,pointer+flag,8);int a2 = T.bin2dec_str(im,pointer+flag+8,8);
pointer +=16;//I wish to skip the User Defined Tags by reading its length
int autoLen = T.bin2dec_str(im,pointer+flag,8)*16+T.bin2dec_str(im,pointer+flag+8,8);
pointer +=autoLen*8;
}
ans = T.huffmanDecoder(im,pointer+flag,dc,row,col);
pointer += ans[0];wordLen = ans[1];
diff = T.i_unsignDecoder(T.bin2dec_str(im,pointer+flag,wordLen),wordLen);
coeff[0][0]= DC0 + diff;
pointer += wordLen;DCcode=Arrays.copyOfRange(im, flag, pointer+flag);
//AC
while(ACnum<=63){
ans = T.huffmanDecoder(im,pointer+flag,ac,row,col);
pointer += ans[0];
if(ans[1]==0){//
break;}
zeroLen = (ans[1]&(0xF0))/16;wordLen = ans[1]&(0x0F);
for(int j=0;j<zeroLen;j++){
coeff[zigZag[ACnum][0]][zigZag[ACnum][1]] = 0;
ACnum ++;
}
dct = T.i_unsignDecoder(T.bin2dec_str(im,pointer+flag,wordLen),wordLen);
pointer += wordLen;

coeff[zigZag[ACnum][0]][zigZag[ACnum][1]] = dct;
ACnum ++;
}

res.add(coeff);
res.add(pointer);
res.add(DCcode);
return res;

}

大家好,首先我很高兴欢迎您看到困扰我两天的棘手问题,并非常感谢您在百忙之中帮助我解决这个问题。我已经关注 StackOverflow 很长时间了,但这确实是我第一次提出问题。

我想要的是在 Java 中读取 JPEG 的 DCT,而不使用 libjpeg 库(用 C++ 编写)。但是,我遇到了许多用户定义的标签(UDT),我发现使用上面在算法中列出的方法很难跳过它们。我对 UDT 不太熟悉。

它们不是以“0xFFXX 0x....”开头(其中 0x.... 给出了该标签的长度)?您的建议将对我有很大帮助。谢谢!

最佳答案

可以由用户定义的标记是 APPn 和 COM。这些标记后面是 BIG ENDIAN 格式的长度。

但是,我很惊讶您发现“很多”这样的标签。通常,JPEG 流中只有一两个。

关于java - JPEG如何在解码文件流时跳过用户定义的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50329326/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com