2016-04-06 27 views
0

istemci tarafında görüntü tipi verirWebSocket API görüntü şifreleme aşağıdaki ikili kullanımı ile tomcat 8 bir web soket sunucusu sahip

BufferedImage img = ImageIO.read(...); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageIO.write(img, "png", baos); 
ByteBuffer bf = ByteBuffer.wrap(baos.toByteArray()); 

Bu kod, istemci tarafında (javascript) bir blob olarak biter ve sonuçta tarayıcıda bir görüntü olarak işlenir ve bu da gayet iyi çalışır. garip tek şey görüntü olarak typeless varılır:
verilerine:; base64, iVBORw0KGgoAAAA ...... == türü (image/png) olmadan. Aynı görüntü için çevrimiçi kodlayıcılar kullanırsanız
alacağım:
veriler: image/png; base64, iVBORw0KGgoAAAA ...... == böylece

ve benim soru (image/png türünü fark) bu neden bu? , byte dönüşüm yanlış mı? Söylediğim gibi, görüntü iyi görüntüleniyor, sadece türü eksik. java websocket sunucusundan gönderilen veri 64 ile kodlanmış değil, istemci tarafında yaptığım bir şey (JS'nin FileReader.readAsDataURL (blob) - çok yaygın). Uzun bir yayın

cevap

0

Hayır, bayt dizisi dönüşüme giden görüntü için

çok teşekkürler ve üzgün yanlış değildir. Bayt dizisi dönüştürme, görüntüleri ikili akış olarak ele alır, içinde bulunan MediaType ile ilgisi yoktur.

görmek istediğiniz tip bir Data URI medya türüdür. Dosyaları bayt dizisine dönüştürmek için kullanılan normal java kodu size data URL scheme uyumlu URL vermez. RFC kaynaktan

veriler: (. isteğe bağlı parametreler ile birlikte) [<ORTAM>] [base64]

<ORTAM> bir internet medya türü özelliğidir "görünümü; base64 ", verisinin base64 olarak kodlandığı anlamına gelir. Olmadan "; base64", ( sekizli bir dizisi gibi) veri güvenli bir URL karakter aralığı içinde oktet ASCII kodlaması kullanılarak ve bu aralık dışındaki oktet URL'lerin standart% xx heks kodlama kullanılarak temsil edilmektedir. <mediatype> belirtilmezse, varsayılan olarak text/plain; charset = US-ASCII. Bir kestirme olarak, "text/plain" atlanabilir ancak charset parametresi verilir.

RFC source

Eğer JavaScript Blob nesneyi oluştururken size okurken buna uygun ortam türünü doldurur FileReader.readAsDataURL kullanarak böylece kendisine MediaType aktaracak bir seçenek var.Muhtemelen basit dosya salt yeterli olacaktır Kodunuzdaki BufferedImage gerekmez

Source

var blob = new Blob([ arrayBufferView ], { type: "image/jpeg" }); 

altına

Örnek olduğunu.

Aşağıdaki kod Apache FileUtils ile eşdeğerdir.

ByteBuffer bf = ByteBuffer.wrap(FileUtils.readFileToByteArray('test.jpg')); 
+0

Merhaba ve ayrıntılı ve hızlı yanıt için teşekkürler. blob, web bağlantısının istemci tarafında çıkıyor ve bu bloğun orada ortam türü olmadığını denetliyor ... bu yüzden istemci tarafında medya türünün ne olduğunu belirleyemiyorum ... Sanırım sadece ikili kullanmamalıyım, kullanacağım java sunucu tarafında json dizisi ve bir özellik özelliği ekleyin ve başka bir özellikte bayt dizisi 64'te kodlayın. Bu düşünebildiğim tek çözüm. Tekrar teşekkürler! – user1061835

+0

Rica ederim, evet daha iyi bir yol gibi görünüyor ya da sunucudaki Veri URL dizesini uygun mediatipe sahip olarak oluşturabilirsiniz. – 11thdimension

İlgili konular