2013-08-06 17 views
6

Bir sunucudan bayt dizisindeki bir görüntü hakkında veri alan bir program yapıyorum. Bu veriyi 24bit BMP biçimine (jpeg, png, bmp veya 8-24-32bpp olsun) dönüştürüyorum. Öncelikle, onu HD'ye kaydediyorum ve sonra onu bir JLabel'ın İkonuna yüklüyorum.Görüntüyü bayt dizisinden dönüştürme ve görüntüleme

  • görüntü yapar: bu hat (ikinci) Bu durumlarda

    File imgFile = new File("d:/image.bmp"); 
    BufferedImage image = ImageIO.read(imgFile); 
    

    için

    java.io.EOFException at 
    javax.imageio.stream.ImageInputStreamImpl.readFully(ImageInputStreamImpl.java:353) at 
    com.sun.imageio.plugins.bmp.BMPImageReader.read24Bit(BMPImageReader.java:1188) at 
    com.sun.imageio.plugins.bmp.BMPImageReader.read(BMPImageReader.java:843) at 
    javax.imageio.ImageIO.read(ImageIO.java:1448) at 
    javax.imageio.ImageIO.read(ImageIO.java:1308) 
    

    : Aşağıdaki özel durum almak bazı durumlar olmasına rağmen, mükemmel çalışıyor JLabel içine yüklenmez, ancak bu benim HD

  • 'da bulunabilir, dönüşüm uygun değildir, çünkü bir şey "kayıyor"
  • resim i bpp, o zaman ben belki resimler çok büyük olduğu sorun düşünülmektedir sandım, bir Word dokümanında italik kullandığınızda gibi

İlk olmakla ı vaka var çalıştığını ve kılıflar her iki öneri için de geçerli değildir. Burada sıkışıp kaldım ve fikirlerden memnun olurum.

+1

Bu görüntüleri oluşturdunuz mu? Düşünebildiğim tek şey, ImageIO'nun desteklemediği BMP formatıyla yaratıldıkları. Belki görüntüleri düzenlemeyi ve tekrar kaydetmeyi denediyseniz. – Piro

+1

Sorun, bazı resimlerin EOF baytlarına sahip olmaması ve bu yüzden "java.io.EOFException" ı almanızın nedeni olduğunu düşünüyorum. Aynı sorunu jpeg formatıyla yaşadım. Dosyanın meta verilerinin dosya uzunluğu hakkında bilgi sahibi olduğunu ve sonuç olarak EOF'nin gerekli olmadığını düşünürseniz, mantıklı olur. Bu gerçek, dosyalarınızın neden HD'nizde bulunduğunu (hatta sanırım açılabileceğini) açıklar ancak java'da istisna alırsınız. – dic19

+1

[this] (http: // stackoverflow.com/questions/12288813/exception-java-awt-color-cmmexception-invalid-image-format-atıldı-ne zaman-resizi/16858161 # 16858161) link, umarım ki 'jpeg' imgeleri ile çalışarak edindiğim tecrübemin bir açıklaması var faydalı. – dic19

cevap

7
  • resim gibidir. Bir italik sözcük sözlüğünde

Spekülatif cevap ;-) .. Sonunda bu mermi öğesi artık ne anlama geldiğini var düşünün, ama burada gider:

yazdığınız görüntü "çarpık" görünüyorsa

, bunun nedeni eksik padding muhtemelen BMP formatı olarak her sütun BMP başlığında (veya yanlış genişlik alanı) belirtir. eni o yardımcı olup olmadığını görmek için ImageIO kullanarak BMP yazmak için 4.

deneyin bir katı değil nerede görüntüleri için EOF istisnalar almak, tavrından şöyledir:

private static BufferedImage createRGBImage(byte[] bytes, int width, int height) { 
    DataBufferByte buffer = new DataBufferByte(bytes, bytes.length); 
    ColorModel cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[]{8, 8, 8}, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); 
    return new BufferedImage(cm, Raster.createInterleavedRaster(buffer, width, height, width * 3, 3, new int[]{0, 1, 2}, null), false, null); 
} 

..

byte[] bytes = ...; // Your image bytes 
OutputStream stream = ...; // Your output 

BufferedImage image = createRGBImage(bytes, width, height); 

try { 
    ImageIO.write(image, "BMP", stream); 
} 
finally { 
    stream.close(); 
} 
+0

siz dehasınız, problemli görüntüler 618, 2671, 598 genişliklerine sahip ... diğerlerinin genişliği 4'ün katlarıdır. – bajla

+1

@bajla Cool. Şimdi cevabı güncelledim, RGB byte 'BufferedImage'. Görüntü verilerinizi doğru bir şekilde nasıl ayarlayacağınızı anlayamadıkça (bunu anlayabildiğimden, Philipp C. Heckel'in orijinal kodu doğru bir şekilde yaptı, fakat ben sadece bunun üzerinden süzüldü) kullanabilirsiniz. – haraldK

+0

Efendim, bu mutlak kazanan bir çözüm! Güncelleme için teşekkürler. Gerçekten onu takdir ederim! Bu şekilde görüntü görüntüleme daha hızlıdır ve şimdi her durumda çalışır! :) :) – bajla

0

Sen ClassName.byteArrayToImage(byte) dokunuşlar, sınıf adıyla deyin ister bayt Array

Blob b = rs.getBlob(2); 
    byte barr[] = new byte[(int)b.length()]; //create empty array 
    barr = b.getBytes(1,(int)b.length()); 

    FileOutputStream fout = new FileOutputStream("D:\\sonoo.jpg"); 
    fout.write(barr); 
+0

Görüntüyü dönüştürmek istemiyorum bytearray .. ve ilk satırda 'rs' nedir? onun bir görüntü tahmin, ama ilk görüntüde bir görüntü yok – bajla

+0

rs ResultSet nesnesidir. –

2

çıkış görüntü dönüştürmek için bu kodu kullanabilirsiniz:

public static BufferedImage byteArrayToImage(byte[] bytes){ 
     BufferedImage bufferedImage=null; 
     try { 
      InputStream inputStream = new ByteArrayInputStream(bytes); 
      bufferedImage = ImageIO.read(inputStream); 
     } catch (IOException ex) { 
      System.out.println(ex.getMessage()); 
     } 
     return bufferedImage; 
}