2015-09-21 22 views
5

Próbuję użyć narzędzia wiersza polecenia "convert" z ImageMagick. Mam plik PNG zakodowany w base64 i muszę go przekonwertować na inny format. Patrzę na documentation i forum discussion co sugeruje, że powinienem być w stanie korzystać z tej składni:Jak przekonwertować obraz base64?

convert inline:file.txt file.jpg 

Ale kiedy to zrobić, otrzymuję komunikat o błędzie:

convert: corrupt image `file.txt' @ error/constitute.c/ReadInlineImage/910. 

Co robię źle? Jak mogę przekonwertować, aby odczytać plik obrazu base64?

Odpowiedz

4

Updated Odpowiedź - teraz, że rozumiem go lepiej sobie :-)

Zasadniczo, można base64 kodowania obrazu za pomocą openssl takiego:

openssl enc -base64 -in image.png > image.b64 

Jednakże, jeśli chce ImageMagick, aby móc go przeczytać, potrzebujesz małego nagłówka na początku, aby powiedzieć ImageMagick co następuje. Nagłówek powinien zawierać:

data:image/png;base64, 

następnie zakodowane base64 swoich danych wygenerowanych przy użyciu wyżej komendy openssl. Tak więc, w zależności od cech twoja powłoka ma, można zrobić to w ten sposób z instrukcji złożonej w bash:

{ echo "data:image/png;base64,"; openssl enc -base64 -in input.png; } > image.b64 

lub jak to w systemie Windows:

echo data:image/png;base64,   > image.b64 
openssl enc -base64 -in image.png >> image.b64 

Gdy masz zdjęcie na które Format można następnie przystąpić do przetworzenia go ImageMagick tak:

convert inline:image.b64 result.png 

Original Odpowiedź

Po DUŻEJ eksperymentowaniu mogę to zrobić !!!:-)

Zacznij Erica (@emcconville) Setup:

# For example 
convert rose: rose.png 
# Create base64 file 
openssl enc -base64 -in rose.png -out rose.txt 

i teraz dodać ten bałagan w ostatnim wierszu:

{ echo "data:image/png;base64,"; cat rose.txt; } | convert inline:- out.jpg 

Chyba data:image/png;base64, nie jest obecny w base64 plik utworzony przez openssl, więc tworzę złożoną instrukcję, która wysyła to z plikiem do stdin z ImageMagick.

3

Updated odpowiedź

Od ImageMagick format docs ...

The inline image look similar to inline:data:;base64,/9j/4AAQSk...knrn//2Q== . If the inline image exceeds 5000 characters, reference it from a file (e.g. inline:inline.txt).

ten wskazuje na dwa "haczyka" przy użyciu formatu inline. Najpierw należy usunąć wszelkie standardowe białe znaki w standardzie base64 (uniksowy podział wiersza), tak aby wszystkie informacje znajdowały się w jednej linii. Po drugie, wszystkie dane powyżej 5000 znaków należy odczytać z bufora plików.

# Copy data to new file, striping line-breaks & adding INLINE header. (Please advise better sed/awk.) 
cat file.txt | tr -d "\r\n" | awk '{print "data:image/png;base64,"$1}' > file.inline 
# Read file as expected 
convert inline:file.inline file.jpg 

oryginalny (nie do końca poprawne) odpowiedź

komunikat „uszkodzony obraz” mówi mi, że nie może być spacji w pliku base64. Jeśli tak, narzędzie zadziała.

# For example 
convert rose: rose.png 
# Create base64 file 
openssl enc -base64 -in rose.png -out rose.txt 
# Read inline & data from stdin -- after stripping whitespace 
cat rose.txt | tr -d "\r\n" | convert inline:data:- out.jpg 
+0

Obawiam się, że dał mi zasadniczo ten sam błąd: "convert: corrupt image" data: - '@ error/existence.c/ReadInlineImage/910. " Nie widzę żadnych spacji w oryginalnym pliku innym niż zakończenie linii (unix). – skiphoppy

+0

Czy możesz odtworzyć tę samą wiadomość z nowego obrazu? – emcconville

+0

Tak, otrzymuję go z dowolnym obrazem base64, którego używam. – skiphoppy

Powiązane problemy