2015-09-21 28 views
5

ImageMagick'ten "convert" komut satırı aracını kullanmaya çalışıyorum. Bir base64 kodlanmış png dosyasına sahibim ve bunu başka bir formata dönüştürmem gerekiyor. Ben documentation bakıyor ve bu sözdizimini kullanmak mümkün olması gerektiğini öneren bir forum discussion am:Baz64 görüntüsünü nasıl dönüştürebilirim?

convert inline:file.txt file.jpg 

Ama bunu yaparken, bu hata mesajını alıyorum:

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

yapıyorum ne yanlış? Bir base64 görüntü dosyasını okumak için nasıl dönüştürebilirim? inline formatını kullanırken

cevap

4

Güncelleme Cevap şimdi Temelde

:-) daha iyi kendim anlamak, base64 böyle openssl kullanarak bir görüntü kodlamak:

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

Ancak eğer ImageMagick'u okumak için, ImageMagick'u aşağıdakileri söylemek için başlangıçta küçük bir başlık gerekir. başlık içermelidir: Yukarıdaki openssl komutunu kullanarak oluşturulan sizin base64 kodlanmış verilerle

data:image/png;base64, 

izledi. Yani, kabuk vardır özelliklere bağlı olarak, sen bash bir bileşik ifadesiyle şöyle yapabilirsiniz:

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

veya Windows böyle

:

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

o görüntüyü sahip olduktan sonra biçimi, daha sonra böyle ImageMagick ile işlemeye devam edebilirsiniz:

convert inline:image.b64 result.png 

Orijinal Cevap

MUCH deneyinden sonra, yapabilirim!:-)

Eric'in (@emcconville) kurulumu ile

Başlangıç ​​ : şimdi

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

ve son satır olarak bu pisliği ekleyin:

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

Ben data:image/png;base64, tahmin base64 bulunmaz openssl tarafından oluşturulan dosya, bu yüzden dosyayı artı ImageMagickstdin gönderen bir bileşik deyim oluşturmak.

3

Güncelleme cevap ImageMagick'in format docs itibaren

...

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).

Bu iki "yakaladım" ima. İlk olarak, herhangi bir standart base64 beyaz boşluk (unix satır sonu), tüm bilgilerin tek bir satırda olacağı şekilde kaldırılmalıdır. Ve ikincisi, 5000 karakter üzerindeki herhangi bir veri bir dosya arabelleğinden okunmalıdır.

# 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 

Orjinal (gerçekten doğru değil) cevap

"bozuk görüntü" mesajı base64 dosyasında boşluk olabileceğini söylüyor. Eğer öyleyse, yardımcı programı çalışır. -

# 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

Korkarım ki bana temelde aynı hatayı verdi: "convert: bozuk görüntü" veri: - '@ error/constitute.c/ReadInlineImage/910. " Orijinal dosyada satır bitişi (unix) dışında herhangi bir boşluk görmüyorum. – skiphoppy

+0

Aynı mesajı yeni bir görüntüden yeniden oluşturabilir misiniz? – emcconville

+0

Evet, kullandığım herhangi bir base64 görüntüsüyle anladım. – skiphoppy

İlgili konular