2012-04-19 23 views
23

में कनवर्ट करें मुझे एक gif छवि को बेस 64 स्ट्रिंग में कनवर्ट करते समय कोई समस्या आ रही है।जावा - छवि को बेस 64

जब मैं इसे परिवर्तित करता हूं, तो कोड मुझे 100,000 एएएएएएएए की तरह जोड़ता है जबकि छवि वास्तव में छोटी है!

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

मूल रूप से यह एक पाठ फ़ाइल out.txt आधार 64 कोड के अंदर के साथ जावा तरीकों में से एक गुच्छा में लिखते हैं,:

यहाँ मेरी कोड है।

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> 

धन्यवाद:

यहाँ एक (छोटे) उत्पादन का हिस्सा है।

संपादित करें: https://stackoverflow.com/a/4265472/1295422

+0

आप आप पूरे बाइट सरणी के रूप में छवि हो और एक Base64 एनकोडर के लिए पारित किया Utils वर्ग – UVM

+0

से toImsge के लिए कोड पेस्ट कर सकते हैं? –

उत्तर

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

कि कोड 102,400 बाइट्स सांकेतिक शब्दों में बदलना होगा, कोई फर्क नहीं पड़ता कि आप कितना डेटा वास्तव में सरणी में इस्तेमाल करते हैं।

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

आपको बाइट्स के मान का उपयोग करने की आवश्यकता है कहीं और पढ़ें।

इसके अलावा, यह पूरी फ़ाइल को एक बार में सरणी में नहीं पढ़ सकता है (यह केवल आई/ओ बफर में जितना अधिक पढ़ता है), इसलिए आपका लूप शायद काम नहीं करेगा, तो आप आधे से समाप्त हो सकते हैं अपनी सरणी में छवि।

मैं अपाचे कॉमन्स IOUtils यहाँ का उपयोग करेंगे:

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

आपने कहा था कि बाइट [] byteArray = new बाइट [102400] केवल बाइट्स की संख्या के भीतर एन्कोड होता है, इसका मतलब है कि यह केवल उस आकार के साथ बाइट्स पढ़ता है और बाकी को पढ़ा नहीं जाएगा? –

+0

यह उस सरणी में निहित सभी 102400 बाइट पढ़ता है और एन्कोड करता है। – Thilo

+0

मुझे यह अपाचे आम IOUtils जार फ़ाइल कहां मिल सकती है? मेरे पास कॉमन्स-io-1.4.jar है। जब मैंने ग्रहण करने के लिए आयात किया और अपना कोड उपयोग किया: 'Base64.encode (FileUtils.readFileToByteArray (f)); 'ऐसी कोई विधि नहीं है, और मुझे निम्नलिखित _ विधि एन्कोड (बाइट [], int) टाइप 6464 प्रकार में मिल रहा है तर्कों के लिए लागू नहीं है (बाइट []) _ –

5

के साथ शुरू करने के लिए, कोड की इस पंक्ति: मैं इस सवाल से base64 कोड का उपयोग कर रहा

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

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

तो यह है के बराबर है बाइटएरे में ऑफ़सेट 0 से लिखना, जहां से आपने पहले लिखा था।

int offset = 0; 
int bytesRead = 0; 

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

के बाद, आप में डेटा (बाइट्स) पढ़ा है, तो आप इसे Base64 में कन्वर्ट कर सकते हैं:

आप कुछ इस तरह की जरूरत है।

हालांकि बड़ी समस्याएं हैं - आप एक निश्चित आकार सरणी का उपयोग कर रहे हैं, इसलिए बहुत बड़ी फ़ाइलें सही ढंग से परिवर्तित नहीं की जाएंगी, और कोड भी इसके कारण चालक है।

मैं बाइट सरणी खाई हैं और कुछ इस तरह के साथ जाने:

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

या यह आगे गाढ़ा रूप थिलो FileUtils साथ है।

+0

मुझे यह समझ में नहीं आ रहा है, 'fis' एक' FileInputStream' है, इसलिए यदि आप इसे पढ़ते हैं, तो क्या आपके द्वारा पढ़े गए बाइट्स को स्ट्रीम से हटाया नहीं जाना चाहिए ताकि अगला 'पढ़ा' वास्तव में नए हो जाए? – Onheiron

2

लाइन

base64String = Base64.encode(byteArray); 

Base64 करने के लिए पूर्ण सरणी (102,400 बाइट्स), बस नहीं बाइट्स आप पढ़ लिया है की संख्या बदल देता है। आपको इसे बाइट्स की संख्या पारित करने की आवश्यकता है।

1

new String(byteArray, 0, bytesRead); सरणी को संशोधित नहीं करता है। सरणी को वास्तविक डेटा आकार में ट्रिम करने के लिए आपको System.arrayCopy का उपयोग करने की आवश्यकता है। अन्यथा आप सभी 102400 बाइट्स को संसाधित कर रहे हैं जिनमें से अधिकांश शून्य हैं।

0

देर GraveDig ... बस फ़ाइल आकार करने के लिए अपने बाइट सरणी विवश।

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

आप अपने सरणी को प्रारंभ करने के लिए फ़ाइल की लंबाई प्राप्त करने के लिए फ़ाइल वस्तु का उपयोग कर सकते हैं:

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

आप एक बड़े सरणी बना सकते हैं और कर सकते हैं तो 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 इच्छित जानकारी

0

शामिल होंगे मैं इस एहसास है कि एक पुराना सवाल है लेकिन शायद कोई मेरा कोड नमूना उपयोगी पाएगा। यह कोड बेस 64 में एक फ़ाइल को एन्कोड करता है और फिर इसे डीकोड करता है और इसे एक नए स्थान पर सहेजता है।

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; 
    } 
} 
संबंधित मुद्दे