2010-12-03 16 views
8

Bir resim dosyasını açmaya ve bir değişken/dizi içinde bir piksel listesini bir renkte depolamaya çalışıyorum, böylece bunları tek tek çıkarabiliyorum.Ruby'de bir görüntü pixel pikselini okuyun

Resim türü: BMP, JPG, GIF veya PNG olabilir. Bunlardan herhangi biri iyi ve sadece birinin desteklenmesi gerekiyor. Renk Çıkışı: RGB veya Hex.

Birkaç kitaplığa baktım (RMagick, Quick_Magick, Mini_Magick, vb.) Ve bunların hepsi overkill gibi görünüyor. Heroku'nun ayrıca ImageMagick ile ilgili bazı zorlukları vardır ve testlerim çalışmıyor. Benim başvurum Sinatra'da.

Herhangi bir öneriniz var mı?

cevap

13

Bunun için Rmagick adlı kullanıcının each_pixel yöntemini kullanabilirsiniz. each_pixel bir blok alır. Her piksel için, blok pikselden, sütun numarasından ve pikselin satır numarasından geçirilir. Soldan sağa ve yukarıdan aşağıya piksellerin üzerinde yinelenir.

Yani gibi bir şey:

pixels = [] 

img.each_pixel do |pixel, c, r| 
    pixels.push(pixel) 
end 
# pixels now contains each individual pixel of img 
+0

Sadece meraklı; Bu durumda Rmagick'in performansı nasıl? Bir oyun motoru üzerinde çalışıyorum, bir Ruby on ucu ve bir bitmap sınıfı kullanan bir hobi olarak piksel-piksel erişiminde son derece yavaştır. –

+0

Asıl soru, yazarın RMagick'e baktığını ve 'overkill' olduğunu belirledi. – Phrogz

+2

@Phogz Yani reddettin mi? OP, bunun aşırı olmayacağını belirlese de, öyle olduğu anlamına gelmez. Onlar gerçekten * ne ihtiyaç duyduklarını bilselerdi, sormazlardı. Bu cevap doğru ve sorulan şeyi yapıyor. – Alex

1

sadece bayt görüntülemek için dosyayı açıyoruz ve bir resim olarak manipüle etmeye gerek yok, o zaman herhangi bir benzeri dosya açılırken basit bir işlemdir diğer, baytların X sayısını okuyarak, daha sonra bunları yineleyerek. Örneğin, ondalık olarak bayt çıktılar. Bayt değerlerine bakmak ve renkleri belirlemek için RGB değerlerini oluşturmak isteyeceksiniz, bu yüzden each_slice(3) kullanarak ve 3 bayt'ın katlarında okuma yardımcı olacaktır.

Çeşitli görüntü biçimleri, türe bağlı olarak, yakalama aygıtı için görüntü, veri biçimi ve EXIF ​​bilgileriyle ilgili bilgileri depolamak için kullanılan farklı üstbilgi ve takip blokları içerir. Sıkıştırılmamış TIFF gibi bir dosyayı okuyacağınız ve doğrudan bayt çıktığında muhtemelen sıkıştırılmamış bir şeyle gitmek iyi olacaktır. Buna karar verdikten sonra, isterseniz üstbilgileri atlamak için dosyaya atlayabilir veya sadece bunları görmek ya da içinde ne olduğunu öğrenmek için bunları okuyabilirsiniz. Vikipedi Image file formats sayfa mevcut çeşitli formatlarda daha fazla bilgi için iyi bir atlama yeridir.

Sadece görüntü verilerini görmek istiyorsanız, yüksek düzeyli kitaplıklardan biri görüntünün belirli bölümlerini yakalamak için arabirimleri olduğundan yardımcı olacaktır. Ancak, aslında baytlara erişmek zor değil, ne de etrafta zıplamak.

EXIF ​​bloğu hakkında daha fazla bilgi edinmek isterseniz, çok sayıda farklı satıcının Jpeg ve TIFF biçimlerini tanımlamak için kullanılan ExifTool kullanışlı olabilir. Perl'de yazılmıştır, böylece kodun nasıl çalıştığına bakabilirsiniz. Dokümanlar, üstbilgi bloklarını ve alanları güzel bir şekilde gösterir ve uygulamayı kullanarak değerleri okuyabilir/yazabilirsiniz.

Yeni bir yönlendiriciyi test etme aşamasındayım, bu yüzden bu kodu test etme şansım olmadı, ancak yakın olmalıdır. Biraz kontrol edip, işe yaramazsa cevabı güncelleyeceğim.

+2

Bu dosya formatının burada önemli olduğunu biliyorsunuz, değil mi? –

+0

Açıklığa kavuşturmalıyım; format önemlidir, çünkü OP başlık bilgisi ve neyi değil sadece piksel verilerini istemektedir. –

+0

OP, başlıkların atlanacağını belirtmez. Eğer varsayıyorsanız belki de OP'den aşağılayıcı olmaktan ziyade açıklığa kavuşmasını isteyebilirsiniz. –

14

Sanırım Chunky PNG sizin için yapmalı. Saf yakut, makul derecede hafif, bellek verimli ve piksel verilerine ve görüntü meta verilerine erişim sağlar.

+0

+1, İyi kütüphane. Bu yanıt, sorulan şeyi yapmak için "Tıknaz PNG" kullanan bir kod snippet'i sağlamanız durumunda daha da iyi olur. Ancak, * bu kütüphane sadece PNG'ler içindir. * OP, özellikle dosyanın sadece PNG'den daha fazla olabileceğini belirtir. – Alex

+4

@Alex OP'yi yanlış yorumladığınızı düşünüyorum. “Bunlardan herhangi birinin iyi ve sadece birinin desteklenmesi gerekiyor” diyor. Bunu, OP'nin kütüphaneye dayanan en kolay formatı kullanacağı anlamına gelir. – Phrogz

+0

Doğru, sadece PNG desteği iyidir. Açıkça RMagick'e ihtiyaç duymayacağından bahsediyor ama yine de ImageMagick desteğini gerektiriyor mu? –

İlgili konular