hi
code below is my huffman algorithm , it works correctly for text but for pictures
it dose not works.
the tree is built correct , i have checked that!
when decompress the pictures windows cant show that picture!
whats wrong ?
public class HopeHuffMan {
public static void main(String[] args) throws IOException {
FileInputStream input = new FileInputStream( "f:/testpic.bmp");
String text=Change_input_to_string_Text(input);
int[] counts = getCharacterFrequency(text);
Tree tree = getHuffmanTree(counts);
String[] codes = getCode(tree.root);
int k1=text.length();
Compress(text,codes);
Decompress (k1,tree);
}
private static String Change_input_to_string_Text(FileInputStream input1) throws IOException{
int ch;
StringBuilder strContent = new StringBuilder("");
while((ch = input1.read()) != -1)
strContent.append((char) ch);
input1.close();
String text = strContent.toString();
return text;
}
private static int[] getCharacterFrequency(String text) {
int[] counts = new int[256];
for (int i = 0; i < text.length(); i++)
counts[(int)text.charAt(i)]++;
return counts;
}
private static Tree getHuffmanTree(int[] counts) {
Heap<Tree> heap = new Heap<Tree>();
for (int i = 0; i < counts.length; i++) {
if (counts[i] > 0)
heap.add(new Tree(counts[i], (char)i));
}
while (heap.getSize() > 1) {
Tree t1 = heap.remove();
Tree t2 = heap.remove();
heap.add(new Tree(t1, t2));
}
return heap.remove();
}
private static String[] getCode(Node root) {
if (root == null) return null;
String[] codes = new String[2 * 128];
assignCode(root, codes);
return codes;
}
private static void assignCode(Node root, String[] codes) {
if (root.left != null) {
root.left.code = root.code + "0";
assignCode(root.left, codes);
root.right.code = root.code + "1";
assignCode(root.right, codes);
}
else {
codes[(int)root.element] = root.code;
}
}
private static int Compress (String text,String[] codes){
String s="";
char cd = 0;
for(int i=0;i<text.length();++i){
cd=text.charAt(i);
s=s+codes[cd];
}
byte [] bytes;
bytes=s.getBytes();
for(int i=0;i<bytes.length;++i){
if(bytes[i]==48) bytes[i]=0;
if(bytes[i]==49) bytes[i]=1;
}
BitOutputStream fop2 = new BitOutputStream("f:/is.oli");
for (int i = 0; i < bytes.length; i++) {
fop2.writeBit(bytes[i]);
}
fop2.close();
return bytes.length;
}
private static void Decompress (int b,Tree t) throws FileNotFoundException, IOException{
BufferedWriter out = new BufferedWriter(new FileWriter("f:/unziped.txt"));
BitInputStream fop2 = new BitInputStream("f:/is.oli");
System.out.print("\n");
for (int i = 0;i<b ; i++) {
Node x = t.root;
while (!x.isLeaf()) {
int bit=fop2.readBit();
if (bit==1) x = x.right;
if (bit==0) x = x.left;
}
out.write(x.element);
}
System.out.print("\n");
out.close();
fop2.close();
}
}