2012-04-19 26 views
23

Sto riscontrando un problema durante la conversione di un'immagine gif in una stringa 64 di base.Java - Converti immagine in Base64

Quando lo converto, il codice mi aggiunge 100.000 AAAAAA mentre l'immagine è veramente piccola!

Ecco il mio codice:

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; 
    } 
} 

Basicaly, si scrive in un file di testo out.txt un mazzo di metodi Java con il codice di base 64 all'interno.

Ecco una (piccola) parte dell'output:

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> 

Grazie.

Edit: sto usando il codice base64 da questa domanda: https://stackoverflow.com/a/4265472/1295422

+0

è possibile incollare il codice per toImsge da Utils classe – UVM

+0

Hai preso l'immagine come intero array di byte e passato a un encoder Base64? –

risposta

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

Tale codice codificherà 102400 byte, indipendentemente dalla quantità di dati effettivamente utilizzati nell'array.

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

È necessario utilizzare il valore di byteLeggi da qualche parte.

Inoltre, questo non può leggere l'intero file nell'array in un colpo solo (si legge tanto quanto nel buffer I/O), quindi il ciclo probabilmente non funzionerà, si potrebbe finire con un mezzo immagine nel tuo array.

userei Apache Commons IOUtils qui:

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

hai detto che byte [] byteArray = new byte [102400] è solo codificato all'interno di quel numero di byte, significa che legge solo byte con quella dimensione e il resto non dovrebbe essere letto? –

+0

Legge e codifica tutti i 102400 byte contenuti in quell'array. – Thilo

+0

Dove posso trovare questo file jar IOUtils di Apache Common? Ho commons-io-1.4.jar. Quando ho importato per eclissi e uso il tuo codice: 'Base64.encode (FileUtils.readFileToByteArray (f));' Non esiste alcun metodo, e sto ottenendo il seguente _Il metodo encode (byte [], int) nel tipo Base64 non è applicabile per gli argomenti (byte []) _ –

5

per cominciare, questa riga di codice:

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

equivale a

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

Quindi è scrivendo in byteArray dall'offset 0, piuttosto che da dove hai scritto prima.

avete bisogno di qualcosa di simile:

int offset = 0; 
int bytesRead = 0; 

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

Dopo aver letto i dati (byte) in poi, è possibile convertirlo in Base64.

Ci sono però problemi più grandi: si sta utilizzando una matrice di dimensioni fisse, quindi i file troppo grandi non verranno convertiti correttamente e il codice è anche più complesso.

avrei fosso di byte e andare con qualcosa di simile:

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

O condensare ulteriormente come Thilo ha con fileutils.

+0

Non capisco, 'fis' è un' FileInputStream' quindi, se si legge da esso, allora i byte che si leggono non dovrebbero essere rimossi dallo stream in modo che il successivo 'read' ne ottenga di nuovi? – Onheiron

2

La linea

base64String = Base64.encode(byteArray); 

converte la gamma completa (102400 bytes) per Base64, non solo il numero di byte che avete letto. Hai bisogno di passarlo il numero di byte.

1

new String(byteArray, 0, bytesRead); non modifica la matrice. È necessario utilizzare System.arrayCopy per tagliare l'array alla dimensione effettiva dei dati. Altrimenti si stanno elaborando tutti i 102400 byte la maggior parte dei quali sono zeri.

0

tardo GraveDig ... Basta limitare l'array di byte per la dimensione del file.

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

È possibile utilizzare il file oggetto per ottenere la lunghezza del file per inizializzare l'array:

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

È possibile creare una matrice di grandi dimensioni e poi copiarlo su un nuovo array utilizzando 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 conterrà le informazioni che si desidera

0

mi rendo conto che questo è una vecchia domanda ma forse qualcuno troverà utile il mio esempio di codice. Questo codice codifica un file in Base64 quindi lo decodifica e lo salva in una nuova posizione.

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; 
    } 
}