2012-04-19 92 views
23

Tôi đang gặp sự cố khi chuyển đổi hình ảnh gif thành chuỗi 64 cơ sở.Java - Chuyển đổi hình ảnh sang Base64

Khi tôi chuyển đổi, mã sẽ thêm tôi như 100.000 AAAAAA trong khi hình ảnh thực sự nhỏ!

Đây là mã của tôi:

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileWriter; 
import java.util.ArrayList; 

public class Main 
{ 

    public static void main(String[] args) 
    { 
     try 
     { 
      FileWriter fstream = new FileWriter("./out.txt"); 
      BufferedWriter out = new BufferedWriter(fstream); 

      File folder = new File("./flags/"); 
      File[] listOfFiles = folder.listFiles(); 

      for (int i = 0; i < listOfFiles.length; i++) 
      { 
       if (listOfFiles[i].isFile()) 
       { 
        Main.readFile(out, listOfFiles[i]); 
       } 
      } 

      out.close(); 
      System.out.println("Done"); 
     } 
     catch (Exception e) {} 
    } 

    public static void readFile(BufferedWriter out, File file) 
    { 
     try 
     { 
      byte[] byteArray = new byte[102400]; 
      FileInputStream fis = new FileInputStream(file); 
      String base64String; 
      int bytesRead = 0; 
      while ((bytesRead = fis.read(byteArray)) != -1) 
      { 
       new String(byteArray, 0, bytesRead); 
       base64String = Base64.encode(byteArray); 
       out.write("public static ImageIcon getFlag" + file.getName() + "()"); 
       out.newLine(); 
       out.write("{"); 
       out.newLine(); 
       ArrayList<String> array = Main.cut(base64String); 
       out.write("return Utils.toImage(\"" + array.get(0) + "\""); 
       for (int i=1; i<array.size()-1; i++) 
       { 
        out.write("<tab>+\"" + array.get(i) + "\""); 
       } 
       out.write("<tab>\"" + array.get(array.size() - 1) + "\");"); 
       out.newLine(); 
       out.write("}"); 
       out.newLine(); 
       out.newLine(); 
      } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static ArrayList<String> cut(String in) 
    { 
     ArrayList<String> array = new ArrayList<String>(); 
     while (in.length() > 76) 
     { 
      array.add(in.substring(0, 77)); 
      in = in.substring(77); 
     } 
     return array; 
    } 
} 

về cơ bản, nó viết trong một file văn bản out.txt một loạt các phương pháp java với nền tảng 64 mã bên trong.

Đây là một (nhỏ) là một phần của đầu ra:

return Utils.toImage("R0lGODlhEAALANUAANPTAPZva/n5AfLySPz8iYqY3O01NgoksbGZa+kYGOskJKi05vb2XZ+r4+05O"<tab>+"Pv7eO3tKPv7bZak4dSvebC76tC2iPNISPX1UMkAAMm6U/NWTeYAAF5y1LqlevNaWpSh3e7uQ+1CQt"<tab>+"gAAKOv5Vds1C1IvpGf37a/7OnTYZ6q6NGkamd71/LyPusvLvFiTEFbx9rPb/HuaczATd7eAPAAAH2"<tab>+"N2vE+PMqiYuXQUsKufJqn4jlRxUlhy+CpelFnz/PxbyH5BAAAAAAALAAAAAAQAAsAAAaQwBVnSBIY"<tab>+"jzTaZsk5OSmEKOHxCAQ8nk1zMUo9Ir8Y42Kx2Dyi5qihi1QqkxzZZtCISBS2JNILoFQDdC0WIj4UO"<tab>+"hImDBMoLjcsBi0KISI8C4kFMB0uOAgykgkOGC8LJgUFFx0IqxAKCQkGGDsjpzUDLBkZEBCvCS0YJW"<tab>+"wfBQxjAyAgDpG/OwfOBzPRANMY1dVBADsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab>+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<tab> 

Cảm ơn.

Chỉnh sửa: Tôi đang sử dụng mã base64 từ câu hỏi này: https://stackoverflow.com/a/4265472/1295422

+0

bạn có thể dán mã cho toImsge từ Utils class – UVM

+0

Bạn có nhận được hình ảnh dưới dạng toàn bộ mảng byte và được chuyển đến bộ mã hóa Base64 không? –

Trả lời

49
byte[] byteArray = new byte[102400]; 
base64String = Base64.encode(byteArray); 

Mã đó sẽ mã hóa 102400 byte, bất kể bạn sử dụng bao nhiêu dữ liệu trong mảng.

while ((bytesRead = fis.read(byteArray)) != -1) 

Bạn cần sử dụng giá trị của byteĐọc ở đâu đó.

Ngoài ra, điều này có thể không đọc toàn bộ tệp vào mảng trong một lần (nó chỉ đọc nhiều như trong bộ đệm I/O), vì vậy vòng lặp của bạn có thể sẽ không hoạt động, bạn có thể kết thúc bằng một nửa hình ảnh trong mảng của bạn.

Tôi muốn sử dụng Apache Commons IOUtils đây:

Base64.encode(FileUtils.readFileToByteArray(file)); 
+1

bạn nói rằng byte [] byteArray = byte mới [102400] chỉ mã hóa trong số byte đó, có nghĩa là nó chỉ đọc byte với kích thước đó và phần còn lại sẽ không được đọc? –

+0

Nó đọc và mã hóa tất cả 102400 byte chứa trong mảng đó. – Thilo

+0

Tôi có thể lấy tệp jar IOUtils Apache chung này ở đâu? Tôi có commons-io-1.4.jar. Khi tôi nhập vào nhật thực và sử dụng mã của bạn: 'Base64.encode (FileUtils.readFileToByteArray (f));' Không có phương pháp như vậy, và tôi nhận được sau đây _The phương pháp mã hóa (byte [], int) trong loại Base64 không áp dụng cho các đối số (byte []) _ –

5

Để bắt đầu, dòng mã này:

while ((bytesRead = fis.read(byteArray)) != -1) 

tương đương với

while ((bytesRead = fis.read(byteArray, 0, byteArray.length)) != -1) 

Vì vậy, nó là viết vào byteArray từ offset 0, thay vì từ nơi bạn đã viết trước đó.

Bạn cần một cái gì đó như thế này:

int offset = 0; 
int bytesRead = 0; 

while ((bytesRead = fis.read(byteArray, offset, byteArray.length - offset) != -1) { 
    offset += bytesRead; 
} 

Sau khi bạn đã đọc các dữ liệu (byte) trong đó, bạn có thể chuyển nó sang Base64.

Mặc dù vậy, có nhiều vấn đề lớn hơn - bạn đang sử dụng mảng kích thước cố định, vì vậy các tệp quá lớn sẽ không được chuyển đổi chính xác và mã cũng khó hơn.

tôi sẽ mương mảng byte và đi với một cái gì đó như thế này:

ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
// commons-io IOUtils 
IOUtils.copy(fis, buffer); 
byte [] data = buffer.toByteArray(); 
Base64.encode(data); 

Hoặc ngưng tụ nó tiếp tục như Thilo có với FileUtils.

+0

Tôi không hiểu điều này, 'fis' là' FileInputStream' vì vậy, nếu bạn đọc từ nó, thì các byte bạn đọc sẽ bị xóa khỏi luồng sao cho 'đọc' tiếp theo sẽ thực sự có được những cái mới? – Onheiron

2

Dòng

base64String = Base64.encode(byteArray); 

chuyển đổi mảng đầy đủ (102.400 byte) để Base64, không chỉ là số byte bạn đã đọc. Bạn cần phải vượt qua nó số byte.

1

new String(byteArray, 0, bytesRead); không sửa đổi mảng. Bạn cần sử dụng System.arrayCopy để cắt mảng thành kích thước dữ liệu thực. Nếu không, bạn đang xử lý tất cả 102400 byte, hầu hết trong số đó là số không.

0

Cuối GraveDig ... Chỉ cần hạn chế mảng byte của bạn để kích thước tập tin.

FileInputStream fis = new FileInputStream(file); 
byte[] byteArray= new byte[(int) file.length()]; 
0

Bạn có thể sử dụng các tập tin đối tượng để có được độ dài của tập tin để khởi tạo mảng của bạn:

int length = Long.valueOf(file.length()).intValue(); 
byte[] byteArray = new byte[length]; 
0

Bạn có thể tạo một mảng lớn và sau đó sao chép nó vào một mảng mới sử dụng System.arraycopy

 int contentLength = 100000000; 
     byte[] byteArray = new byte[contentLength]; 

     BufferedInputStream inputStream = new BufferedInputStream(connection.getInputStream()); 
     while ((bytesRead = inputStream.read()) != -1) 
     { 
      byteArray[count++] = (byte)bytesRead; 
     } 

     byte[] destArray = new byte[count]; 
     System.arraycopy(byteArray, 0, destArray , 0, count); 

destArray sẽ chứa các thông tin mà bạn muốn

0

tôi nhận ra rằng đây là một câu hỏi cũ nhưng có lẽ ai đó sẽ tìm thấy mẫu mã của tôi hữu ích. Mã này mã hóa một tập tin trong Base64 sau đó giải mã nó và lưu nó vào một vị trí mới.

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.Arrays; 

import org.apache.commons.codec.binary.Base64; 

public class Base64Example { 

    public static void main(String[] args) { 

     Base64Example tempObject = new Base64Example(); 

     // convert file to regular byte array 
     byte[] codedFile = tempObject.convertFileToByteArray("your_input_file_path"); 

     // encoded file in Base64 
     byte[] encodedFile = Base64.encodeBase64(codedFile); 

     // print out the byte array 
     System.out.println(Arrays.toString(encodedFile)); 

     // print the encoded String 
     System.out.println(encodedFile); 

     // decode file back to regular byte array 
     byte[] decodedByteArray = Base64.decodeBase64(encodedFile); 

     // save decoded byte array to a file 
     boolean success = tempObject.saveFileFromByteArray("your_output_file_path", decodedByteArray); 

     // print out success 
     System.out.println("success : " + success); 
    } 

    public byte[] convertFileToByteArray(String filePath) { 

     Path path = Paths.get(filePath); 

     byte[] codedFile = null; 

     try { 
      codedFile = Files.readAllBytes(path); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return codedFile; 
    } 

    public boolean saveFileFromByteArray(String filePath, byte[] decodedByteArray) { 

     boolean success = false; 

     Path path = Paths.get(filePath); 

     try { 
      Files.write(path, decodedByteArray); 
      success = true; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return success; 
    } 
} 
Các vấn đề liên quan