2016-04-14 29 views
0

BufferedImages pikselinden piksele sık sık geçmeyi gerektiren bir programım var. Normalde verim, benim için umursayacak kadar önemli değildi, ama gerçekten her milisaniyeyi elde edebilirim. Örnek olarak Java'da BufferedImage pikselleri arasında daha hızlı yineleme yöntemi var mı?

, hemen şimdi, en hızlı şekilde ben bir görüntüde kırmızı kanalın izole buldum şuna benzer: bir zamanlar diziyi doldurmak için resmin geçiyor demektir

int[] rgb = image.getRGB(0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth()); 


    for(int i = 0; i < rgb.length; i ++) 
     rgb[i] = rgb[i] & 0xFFFF0000; 

    image.setRGB(0, 0, img.getWidth(), img.getHeight(), rgb, 0, img.getWidth());   

, tekrar filtreyi uygulamak ve son olarak pikselleri güncellemek için üçüncü kez. Ayrıca alfa kanalı 0 olan herhangi bir pikselin tamamen sıfırlandığı göz önüne alındığında, en az bir kez daha geçmelidir.

Ayrıca getRGB() ve setRGB() öğelerinin tek tek piksel sürümlerini daha geleneksel bir iç içe geçmiş döngüde kullanmayı denedim, ancak bu daha da yavaş olsa da (daha az RAM'i almasına rağmen ]).

Bu, yinelenen türlerin çözdüğü türden bir sorundur, ancak bu ilkeyi görüntülere uygulamanın herhangi bir yolunu bulamıyorum. Bu proje için, çalışıyorsa "en iyi uygulamalar" olmayan toplam korsanlarla birlikte iyiyim.

Tamponlu bir resmin ham verileri üzerinde yineleme yapmanın bir yolu var mı?

+0

. Buradan başlayarak http://stackoverflow.com/questions/1975824/fastest-way-to-compare-pixel-values-between-two-bufferedimages?rq=1 ve – gpasch

+1

adresine gidin. Bu, gerçekten yeni bir şey olan tek şey "ama genel olarak performans için sadece Raster ve DataBuffer'a göz atmalısınız." Biraz daha spesifik olabilir misin? – user3236716

cevap

2

en hızlı yolu piksel değerine doğrudan erişimi olduğu DataBuffer erişmek, ancak tüm vakalar/türünü işlemek zorunda: bu soru zaten yanıtlandı

public void Test(BufferedImage img) 
    { 
    switch (img.getType()) 
     { 
     case BufferedImage.TYPE_BYTE_GRAY : 
     case BufferedImage.TYPE_3BYTE_BGR : 
      byte[] bufferbyte = ((DataBufferByte)img.getRaster().getDataBuffer()).getData() ; 
      //... 
      break ; 
     case BufferedImage.TYPE_USHORT_GRAY : 
      short[] buffershort = ((DataBuffer)img.getRaster().getDataBuffer()).getData() ; 
      //... 
      break ; 
     //Other cases 
     } 
    } 
İlgili konular