2016-10-05 2 views
2

Я знаю, что это странный вопрос, но мне действительно нужно это работать. У меня очень маленькое изображение .png, мне нужно импортировать («наберите его») в исходный файл java без чтения из файловой системы. (По крайней мере, когда программа не запускается, я могу прочитать изображение в системе с другими фиктивными приложениями, чтобы синтаксический анализ был в двоичном формате или я не знаю, что еще).Как сохранить и прочитать изображение как текст, встроенный в код

Другими словами, мне буквально нужны строки кода, которые представляют изображение, которое я буду размещать только один раз (мне не нужно импортировать «на лету», я просто печатаю его и оставляю там навсегда).

Изображение должно быть сохранено как ImageIcon, и поскольку вы можете набирать байт-массивы, я не понимаю, почему было бы невозможно создать небольшую банку, которая читает изображение, печатает массив байтов файл .txt, который затем можно скопировать и поместить в исходный файл. Я просто не знаю, как делать эти шаги точно.

Примечание: Я знаю, что это является не что-то можно было бы или должен сделать, это для конкретного проекта, и мне нужно сделать это таким образом, причины выходят за пределы меня.

ПРИМЕЧАНИЕ 2: Я не могу использовать внешнюю lib или зависимость.

+0

http://myjeeva.com/convert-image-to-string-and-string- to-image-in-java.html Я думаю, что эта статья раскладывает его, красиво. Образец кода также предоставляется. – Beatty

+0

Мне очень жаль, что я забыл добавить, файл должен быть без зависимостей, я не могу использовать Apache. Я все равно посмотрю в статье и посмотрю, смогу ли что-нибудь сделать из этого, спасибо –

+1

Считаете ли вы, что фактический png как ресурс в вашем приложении? –

ответ

2

FYI, подобные вопросы этот, который может помочь обеспечить более глубокое объяснение/ответ: here и here.

Мой ответ решить вопрос о,

Я буквально нужно строк кода, которые представляют собой изображение, которое я только положить туда один раз (не нужно импортировать на лету, я просто напечатайте его и оставите там навсегда).

должен использовать Base64 и читать код изображения в этом определенном формате.

Например, следующий код создает простую JFrame, чтобы отобразить строку base64 как значок изображения:

import java.awt.BorderLayout; 
import java.awt.image.BufferedImage; 
import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.util.Base64; 
import java.util.Scanner; 

import javax.imageio.ImageIO; 
import javax.swing.*; 

public class App extends JFrame { 
    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       App app = new App(); 
       app.setVisible(true); 
      } 
     }); 
    } 
    public App() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JLabel photo = new JLabel(); 
     photo.setVerticalTextPosition(JLabel.BOTTOM); 
     photo.setHorizontalTextPosition(JLabel.CENTER); 
     photo.setHorizontalAlignment(JLabel.CENTER); 
     photo.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); 
     add(photo, BorderLayout.CENTER); 
     setSize(200, 100); 
     setLocationRelativeTo(null); 

     // Ex. stackoverflow.ico (then converted to png for this example) 
     String imgBase64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAJ+SURBVFhH7ZXbS1RRFMb7Y5qHiu4PEfUQRS9B9FBEBBVFT70WvQQhmJpdLUkMS0mNikDKlKxIDR+iCz3YmJgWCZmlKWPNPvd9vvZeZ8+ZS3NmzlzoYn2wHmatYe/f2etbey/Ab9Z/gPkFwCcGoTVtB/8yojL5VTYA1/gGdnIV4hULoV3cBFefU5XcKusJ2G96BECEIPT2A4LKUZVglQYgNuBTo+qHJ7P3PAHIMB+dUtlglQRgdh1HvHIx7Jc3VEbI5dCvH1QQEdjRblXIrqIB3NhHsDNr/a81Oo4AlubVhB+0+s1erWop+OdhymdTSSfgfp+C3rLbh9AatoB/fU81Pv0OrGYl5VndBrhslvKZKt2E3KFeJ8zHalbAHrpPJWfksZ/XW/eSZzJVMIA92CkW7qVep8oZfuiPodzU7KkScDas/nqVE6aUuQwVBODN+mpaTLuwEdbTFsolxGc+QGvc6m+oN++COzcJ/eYhsOpl6WZVKghAjpxcNLGBDFa9HGZ3hd972AaMO0eT9dNr4IwNgM+Oe/UMFeUB/inqbSJGMAkTocvHGe2n9tivbiN+YgnYufV0CkEqyYQum4H15BLY2XUpIKI9YgStZ61wxl/kfRdCAzhv+4QB74rxGvvZzcJs9ut70K7sSAOxBhrVH4IVGkC/tie5uLhc9Ks7qffyqPnkEEFIyRfR6DhMl5RrximXS+EB2vbTjKd+YVpULoJ2eRuMzmOwnrfTRIRRYR4Q5pJut6Nd4vKpFZfLPrBabywzQ7YsjAIBmttuUYSRG5sQF9EDmH119BCR87UY1fKtUxaAXCobQLZjzhUJzR+AYvX3A5QrgvTnAvwq/esAwA/q0/BiaJrlDgAAAABJRU5ErkJggg=="; 
     String data = imgBase64.substring(imgBase64.indexOf(",") + 1); 
     ByteArrayInputStream stream = new ByteArrayInputStream(Base64.getDecoder().decode(data.getBytes())); 
     BufferedImage image = null; 
     try { 
      image = ImageIO.read(stream); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     ImageIcon imgIcon = new ImageIcon(image.getScaledInstance(32, 32, 0)); 
     photographLabel.setIcon(imgIcon); 
    } 
} 

Этот код не использует никаких внешних библиотек и выполняет большую часть задачи, которую вы запросили - поэтому, чтобы полностью ответить на этот вопрос, вот как я буду читать этот ввод с консоли (иначе пользователь вводит в консоль). Примечание: после строки с объявлением объекта потока ByteArrayInputStream будет добавлена ​​следующая часть кода.

Scanner sc = new Scanner(System.in); 
System.out.println("Type .png input (base64): "); 
StringBuilder sb = new StringBuilder(); 
while (sc.hasNext()) 
    sb.append(sc.next()); 
String data = sb.toString(); 

Это по существу заменить две строки «Струнный imgBase64» и «строка данных» из предыдущего примера фрагмент кода.

Надеется, что это ответ на ваш вопрос, пожалуйста, обеспечивает обратную связь для дальнейшего уточнения или знака в качестве ответа;)

Приветствия

Edit: Для перехода от и изображений на строку, изображение -> string: Примечание. Я использую файл для этого примера, вы также можете просмотреть параметры URL или потока, которые могут быть использованы в качестве альтернативы в методе ImageIO.read(). Также обратите внимание: при попытке использовать ресурсы java 1.7+ (можно было бы легко попробовать, если потребуется, для более ранних версий)

Допустим, вы загрузили объект ImageIcon откуда-то, URL/поток/файл, вы назови это. В моем примере я буду использовать локальный файл:

ImageIcon icon = new ImageIcon("C:\\Users\\Nick\\Desktop\\favicon.png"); 

Теперь возьмите этот значок изображения и получить строку base64 вы спрашиваете? Вот один из способов, как сделать это/как я это сделал (используя уже загруженный объект значок ImageIcon):

try (ByteArrayOutputStream os = new ByteArrayOutputStream(); 
     ImageOutputStream ios = ImageIO.createImageOutputStream(os)) { 
    BufferedImage img = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.BITMASK); 
    Graphics g = img.createGraphics(); 
    icon.paintIcon(null, g, 0, 0); 
    g.dispose(); 
    ImageIO.write(img, "png", ios); 
    byte[] bytes = os.toByteArray(); 
    String data = Base64.getEncoder().encodeToString(bytes); 
    System.out.println(data); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Одна вещь, которую я хотел бы отметить, это флаг «BufferedImage.BITMASK» используется. Это может быть легко перемешано или переключено и вызвать несоответствия с декодированными/закодированными строковыми значениями.

Подробнее о классе ImageIcon здесь: https://docs.oracle.com/javase/7/docs/api/javax/swing/ImageIcon.html

Используется этот инструмент для преобразования StackOverflow значок в base64 https://www.base64-image.de/

1

«Напечатайте» свое изображение в формате netpbm, а затем преобразуйте его в PNG или что угодно.

Например, я использую редактор уценки SE для создания этого изображения:

P3 3 3 255 
0 0 0 0 0 0 0 0 0 
0 0 0 0 255 0 0 0 0 
0 0 0 0 0 0 0 0 0 

Это 3x3 изображение одного зеленого пикселя, окруженный черной рамкой.

Сохраните его как "image.ppm". Использование ImageMagick для преобразования его в PNG (увеличивая его 20x, так что вы можете увидеть его):

magick convert image.ppm -sample 2000% image.png 

(Здесь вы преобразовать image.ppm в свой формат ImageIcon вместо)

дисплей это:

enter image description here

Вы не хотите, чтобы «типа» непосредственно в формате PNG, потому что это было бы просто странно:

data:image/png;base64, 
UDMgMyAzIDI1NQogICAgMCAwIDAgIDAgMCAwICAgIDAgMCAwIAogICAgMCAwIDAgIDAgMjU1IDAg 
IDAgMCAwCiAgICAwIDAgMCAgMCAwIDAgICAgMCAwIDAK 

Если вы начинаете с PNG и хотите «набрать» его, снова вы можете использовать ImageMagick, но в другом направлении.

Например, принимая свой аватар и превращение его в mark.ppm

magick convert 8ede7*.png -compress none mark.ppm 
cat mark.ppm 
P3 32 32 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
255 255 255 255 255 255 255 232 136 234 255 255 255 255 255 255 255 255 
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 229 119 
231 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
255 255 255 255 239 174 241 255 255 255 255 255 255 255 255 255 255 255 
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
255 255 255 255 255 255 255 255 255 255 232 136 234 207 1 211 255 255 
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 
255 255 255 255 207 1 211 229 119 231 255 255 255 255 255 255 255 255 
[...] 

Если вы можете иметь дело с заголовками типа "C", вы можете попробовать

magick 8ede7*.png mark.gif 
magick mark.gif mark.h 
cat mark.h 
    mark.h (GIF). 
*/ 
static unsigned char 
    MagickImage[] = 
    { 
    0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x20, 0x00, 0x20, 0x00, 0xF3, 0x0E, 
    0x00, 0xCF, 0x01, 0xD3, 0xD7, 0x30, 0xDB, 0xD9, 0x38, 0xDC, 0xDA, 0x40, 
    0xDD, 0xDC, 0x49, 0xDF, 0xE2, 0x67, 0xE4, 0xE5, 0x77, 0xE7, 0xE8, 0x88, 
    0xEA, 0xEF, 0xAE, 0xF1, 0xF1, 0xB6, 0xF2, 0xF3, 0xBF, 0xF4, 0xF4, 0xC7, 
[...] 
+0

Но что, если изображение оказывается более сложным, например, очень сжатая фотография? –

Смежные вопросы