Cubify Bu! Gri tonlamalı bir ders… er… renkli… er… her neyse


27

Rubik küpünün ve güzel sanatının büyük bir hayranı olarak, gerçekten güzel şeyler yapmak için ikisini bir araya getirmeye çalışıyorum. Temelde minik Rubik küplerini Rubik küp sanatının oluşumunda ilkel pikseller oluşturmak için çözme. Bu tür sanatlara örnekler bu bağlantıdan görülebilir: http://google.com/search?q=rubik%27s+cube+art

Şimdi, bu Code Golf'un amacı bir görüntüyü girdi olarak kabul eden ve ardından aşağıdaki şekilde dönüştüren bir kod oluşturmaktır:

Görüntü başlangıçta web uyumlu gri tonlamalı renklere indirgenir. Bunun arkasındaki neden, ağda güvenli gri tonlamalı paleti izole etmemiz gerektiğidir (yani 000000, 333333, 666666, 999999, CCCCCC ve FFFFFF). Gri tonlamaya dönüştürme kolorimetrik yöntemi üzerine bir algoritma şu adreste mevcuttur: http://en.wikipedia.org/wiki/Grayscale#Colorimetric_.28luminance-preserving.29_conversion_to_grayscale , bunu ilham olarak kullanmak istemeniz gerekir.

Biri daha sonra gri tonlamayı uygun renklere dönüştürür. Hızlı bir şekilde parçalamak için: 000000 Rubik'in mavisini, 333333 Rubik'in kırmızısını, 666666 Rubik'in yeşilini, 999999 Rubik'in turuncularını, CCCCCC'nin Rubik'in sarılarını, FFFFFF'nin de Rubik'in beyazını göstermesini sağlayacak.

Elde ettiğiniz kodun fotoğrafın paletinden doğrudan Rubik'in renklerine işlenmesini tercih ederim. Web uyumlu gri tonlamaya ve ardından karşılık gelen Rubik'in paletine dönüştürmekten iki aşamalı yöntem, yalnızca işlemin arkasındaki mantık hakkında bir fikir vermektir, ancak bunu yapmanız sizin için daha kolaysa, elbette bunu yapın.

Rubik'in paleti için gerçek RGB değerleri aşağıdakilere karşılık gelmelidir:

  • Kırmızı: # C41E3A
  • Yeşil: # 009E60
  • Mavi: # 0051BA
  • Turuncu: # FF5800
  • Sarı: # FFD500
  • Beyaz: #FFFFFF

Bir örnek vermek gerekirse, Abraham Lincoln'ün kafasını aşağıdaki resimde kestim: görüntü tanımını buraya girinve aşağıdakileri üretecek algoritmayı oluşturdum:

görüntü tanımını buraya girin

Izgara, her bir minyatür Rubik küpünün görüntüyü oluşturmak için nasıl yapılandırılması gerektiğini görebilmeniz için orada. Ortaya çıkan görüntünün gerçek boyutu 45 piksel x 45 pikseldir, yani (45/3) * (45/3) = 15 * 15 = 225 minyatür Rubik küpleri bu görüntüyü oluşturmak için kullanılır. Elimdeki görüntüyü benim gibi bir ızgarayla sunmanızı beklemiyorum.

Demek gereken bu:

  1. Bu algoritma tarafından işlenecek görüntünün, x piksel genişliğinde y piksel yüksekliğinde x piksel olması gerekir; öyle ki, x ve y, 3'ün katlarıdır. Görüntünüz oldukça büyükse, onu 45 x 45 ila 75 x 75 civarında bir şeye ya da işlemden önce boyutlarda küçültmeniz önerilir. Bu yeniden boyutlandırma bileşeninin İSTEĞE BAĞLI olduğunu unutmayın.

  2. Mozaiği oluşturmak için görüntünün sextacolored Rubik küp paletine dönüştürülmesi gerekir.

  3. Ortaya çıkan görüntünün işlemden sonra geçerli bir grafik dosyası olması gerekir. Kodunuzun çalıştığını ispatlamak için, Amerika Birleşik Devletleri başkanlarından birinin resmine veya iyi bilinen bir Hollywood ünlüsüne karşı çalıştırın. Örneğimde Abraham Lincoln'ü zaten kullandım, bu yüzden bu başkan kullanılamaz. Kullandığınız dili, bayt sayısını ve çekim öncesi ve sonrası da dahil olmak üzere kodunuzu test etmek için kullanılan başkan / ünlüyü sağladığınızdan emin olun ...

  4. Her giriş, kendi test durumu olarak benzersiz bir başkan / şöhrete sahip olmalıdır. Kopyaları kabul etmeyeceğim. Bu, yinelenen sonuçların farklı kod girişlerini test etmek için kullanılmamasını sağlayacaktır. Kodunuzun çalıştığını söylemek çok iyi, kanıtlamak için başka bir şey.

5. En kısa kod kazanır.

Bunu bir popülerlik yarışmasına dönüştürüyorum ... Bayt sayısıyla rekabet etmek zorunda kalmadan bunu kimin yapabileceğini görmeyi tercih ederim ... Bu yüzden 28 Şubat 2014'ten sonra bunu bir ödülle birlikte vereceğim.


4
Bir bağlantıya güvenmek yerine Rubik RGB değerlerini gönderiye eklerseniz daha iyi olacağını düşünüyorum.
SztupY

Does "görüntü genişlik x piksel y piksel yüksek olmalıdır işlenecek" o yeniden boyutlandırma kodunun bir parçasıdır ya da o görüntü gerekli boyuta önceden işlenir mi?
user2846289

Sadece bir yüzünü kısıtlarsanız, Rubik Küp'ün imkansız halleri var mı?
Nick T

1
@WallyWest Uygulamamı SEVECEĞİNİZ MineCam, bunu yapar, ancak kareler yapmak yerine, maden zanaat bloklarını kullanır ve aynı zamanda gerçek zamanlı iPhone kamerayla saniyede 15 kez yapar, böylece etrafınızdaki tüm dünyayı bir dünyaya dönüştürür. mayın zanaat evreni. itunes.apple.com/us/app/minecam/id675845303?mt=8 (Keşke dünya hahahaha için bir tohum da üretebilseydi)
Albert Renshaw

2
@WallyWest: tembellikten ibaret değil. Sorun, internetin geri kalanı kapalı olsa bile, başlamanız için gereken tüm bilgileri size vermelidir. Bir veya iki yıl içinde, bu bağlantı kaldırılabilir ve kimse bağlantıyı güncellemez. Size sadece kolayca küçük eşleştirme tablosunu gibi ekledik olabilir (sorunu çözmek için gerekli değildir) Web uyumlu gri tonlama renkleri oluşturma hakkında yeterli bilgi verirseniz #000000 => #0051BA, vb
SztupY

Yanıtlar:


16

Imagemagick (108)

Sürüm: ImageMagick 6.8.7-7 Q16 x86_64 2013-11-27

Aşağıdaki çağrı:

$ convert -resize 75x75 -fx "q=p.intensity;q<1/6?#0051BA:q<2/6?#C41E3A:q<3/6?#009e60:q<4/6?#ff5800:q<5/6?#FFD500:#FFF" input output

burada inputve outputgiriş ve çıkış dosya için değiştirilmesi gerekir.

Sadece -resizeve arasındaki boşlukları saydım, #FFF"bunun geçersiz olduğunu düşünüyorsanız yorum yapmaktan çekinmeyin.

Lenna'yı resim olarak kullandım (bir Playboy'da göründü ve bunu yapan herkes Hollywood şöhreti olarak sayılmalı, değil mi?)

Giriş:

Giriş görüntü

Çıktı:

$ convert -resize 75x75 -fx "q=p.intensity;q<1/6?#0051BA:q<2/6?#C41E3A:q<3/6?#009e60:q<4/6?#ff5800:q<5/6?#FFD500:#FFF" Lenna.png LennaRubik.png

Oluşturulan görüntü

Çıktı genişledi:

Büyütülmüş resim

Notlar: imagemagick docs'a göre bir ifadede birden fazla koşullu operatöre sahip olamazsınız, ancak çağrı hala iyi çalışıyor gibi görünüyor, bu yüzden muhtemelen bu sorun giderildi ve dokümanlar henüz güncellenmedi.

Sonuç görüntüsüne göre koşmak (renklerin gerçekten iyi olduğunu göstermek için):

$ identify -verbose LennaRubik.png
  (...)   
  Colors: 6
  Histogram:
       338: (  0, 81,186) #0051BA srgb(0,81,186)
      1652: (  0,158, 96) #009E60 srgb(0,158,96)
      1187: (196, 30, 58) #C41E3A srgb(196,30,58)
      1674: (255, 88,  0) #FF5800 srgb(255,88,0)
       706: (255,213,  0) #FFD500 srgb(255,213,0)
        68: (255,255,255) #FFFFFF white
  (...)

Lenna'nın uygun bir ünlü olmadığını düşünürseniz, işte Bruce Willis:

Bruce Original

Bruce Small

Bruce Large


+1 Sanırım cevabınızın neredeyse rakipsiz (veya hatta hiç yenilmez) olduğunu düşünüyorum. Sadece, tartışmasız bir Hollywood şöhreti veya Amerikalı başkan fotoğrafını çekip bunu eklemenizi önereceğim (Lenna'yı çıkarmanıza gerek yok, ikisini de saklayın). Aksi halde, bazı sıkıcı insanlar, sadece bunun için şikayet edebilir ve oy kullanamaz.
Victor Stafusa

@Victor: Mathematica, Matlab veya Octave'un kolayca yenebileceğini düşünüyorum, zira fxparça içindeki koşullar daha iyi ifadeli bir dilde daha da sıkıştırılabilir. Ve bu diller de yerel görüntü desteğine sahip (yani imagemagick / gd / etc dosyasını içe aktarma gereği olmadan hiçbir karakter kaybolmuyor)
SztupY

@SztupY Lenna'yı çok iyi tanıyorum ... Bunu da sayacağım ... Bruce Willis ile de iyi iş
çıkardın

1
Lenna sevimlidir (r). Yukarı.
blabla999

İş için doğru aracı kullanmak için + 1'leyin. Anladığım kadarıyla, imagemagick'i kullanmanın doğru yolu ilk önce görüntüyü seçeneklerden ziyade çıktı dosyasından çağırmak.
Kuzen Kokain,

14

Mathematica

Greta Garbo'nun yer aldığı ABD pulundan kare bir bölge ile çalışacağız. Olarak anılacaktır j.

j

f[i_,rs_,m_:True]:=
Module[{(*rs=rastersize-4*)r={0.77,0.12,0.23},gr={0,0.62,0.38},b={0,0.32,0.73},o={1,0.35,0},y={1,0.84,0},w={1,1,1},
c1={r,gr,b,o,y,w},grayGreta,garboColors},
grayGreta=(*Reverse@*)ImageData[ColorQuantize[Rasterize[i,(*ImageResolution \[Rule]15*)RasterSize->rs+1,ImageSize->rs],6]];
garboColors=Union@Flatten[grayGreta,1];
ArrayPlot[grayGreta/.Thread[garboColors-> RGBColor@@@c1],
Mesh->If[m==True,{rs-1,rs-1},None],MeshStyle->Black]]

F işlevi 3 parametre alır:

  • i hangi görüntüye atıfta
  • rs, raster boyutu
  • mMesh hatlarının kullanılıp kullanılmayacağını belirten bir boolean değişkeni. (Varsayılan ayar Doğru'dur).

15, 30, 45 ve 75 raster boyutlarını kullanma:

GraphicsGrid[{{f[j, 15], f[j, 30]}, {f[j, 45], f[j, 75]}}, ImageSize -> 800]

4 garbos

Rubrik küpü yapan kimsenin bu kadar çok parçalı olduğunu düşünemiyorum! Yine de ilginç bir egzersiz.


Renklerle uğraşmak

Bu daha önceki bir girişten. Kod biraz farklı. Graphicsyerine kullanılırArrayPlot . Ayrıca tam damgayı kare olmasa da kullanıyoruz.

Rubrik küp renklerinde 6! = 720 permütasyon vardır.

Aşağıdaki, üst satırın orta görüntüsünü gösterir (aşağıdaki 6 görüntüyü ayarlayın). Gri tonlama değerleri en koyudan en açıka doğru ayarlandığında, renkler {r, gr, b, o, y, w} şeklindedir. Diğer varyasyonlar yine de çalışır.

i gri tonlamalı orijinal görüntüdür.

Graphics[Raster[(g=Reverse@ImageData[ColorQuantize[Rasterize[i,RasterSize->75],6]])
/.Thread[Union@Flatten[g,1]-> {{7,1,2},{0,6,4},{0,3,7},{10,4,0},{10,8,0},{10,10,10}}/10]]]

i Greta Garbo damgasının orijinal gri tonlamalı görüntüsüdür.

Rasterize[garbo,RasterSize->75 görüntüyü 75 x 75 dizisine rasterleştirir.

ColorQuantize[<>, 6] gri tonlama değerlerini 6 kümesine düşürür.

ImageDataveri dizisini görüntüden alır; ters duruyor.

Reverse veri dizisini çevirir, bu nedenle resmi, sağa yukarı doğru çevirir.

garboColors nicelenmiş görüntüdeki 6 gri tonlamalı değerlerdir.

Graphics[Raster son resmi görüntüler.

rubrikColors Rubrik küp renklerinin RGB değerleridir.

Kırmızı, Yeşil, Mavi, Turuncu, Sarı ve Beyaz'ın çeşitli renk permütasyonları verilmiştir.

r={0.77,0.12,0.23};gr={0,0.62,0.38};b={0,0.32,0.73};o={1,0.35,0};y={1,0.84,0};w={1,1,1};
c1={r,gr,b,o,y,w};
c2={r,b,gr,o,y,w};
c3={b,r,gr,o,y,w};
c4={gr,b,r,o,y,w};
c5={b,r,gr,y,o,w};

Ve kod:

grayGreta=Reverse@ImageData[ColorQuantize[Rasterize[i,RasterSize->75],6]];
garboColors=Union@Flatten[grayGreta,1];
Grid[{{i,
Graphics[Raster[grayGreta/.Thread[garboColors-> c1]]],
Graphics[Raster[grayGreta/.Thread[garboColors-> c2]]]},
{Graphics[Raster[grayGreta/.Thread[garboColors-> c3]]],
Graphics[Raster[grayGreta/.Thread[garboColors-> c4]]],
Graphics[Raster[grayGreta/.Thread[garboColors-> c5]]]}}]

Garbos


Garbos Galore

6 Rubrik küp rengini kullanan Greta Garbo'nun (720) fotoğrafı. Bazı görüntüler diğerlerinden daha iyi çalışıyor, sence de öyle değil mi?

GraphicsGrid@Partition[(Graphics[Raster[grayGreta /. Thread[garboColors -> #]]] & 
/@ Take[Permutations[{r, gr, b, o, y, w}, {6}], 72]), 12]

garbos bolca


Greta, oh Greta ... Bu beklediğimden daha iyi oldu. @DavidCarraher, burada iyi iş
çıkardın

@WallyWest. Teşekkürler. Çok ilginç bir mücadele oldu.
DavidC

Mathematica'nın görüntüyü yeneceğinden çok emindim, bu daha da fazla golf oynayamaz mı? Bütün bu işlevler gerekli mi?
SztupY

1
@SztupY Kodun yarısı renkleri doğru almaya adamıştır. Reverseresmi baş aşağı bırakarak ortadan kaldırılabilir, ancak başka hiçbir fırsat göremiyorum. Mathematica etkileyici ancak büyük kelimeler kullanıyor. Resimler konusunda uzman biri muhtemelen kod boyutunu biraz azaltabilir, ancak görüntü kodunuzu yenebileceklerinden şüpheliyim.
DavidC,

1
Kodda gerçekten bazı tutarsızlıklar vardı. Umarım şimdi gittiler. iorijinal resmi tutun. grRubrik'in yeşili anlamına gelir. ggri tonlamalı görüntünün rasterleştirilmiş ve nicelenmiş görüntü verilerini belirtir.
DavidC

6

Küçük Konuşma (Küçük konuşma / X), 289 139 *

giriş: i; çıkış: r

r:=i magnifiedTo:75@75.
r colorMapProcessing:[:c||b|b:=c brightness.Color rgbValue:(#(16r0051BA 16rC41E3A 16r009e60 16rff5800 16rFFD500 16rFFFFFF)at:(b*6)ceiling)]

giriş:

görüntü tanımını buraya girin

çıktı:

görüntü tanımını buraya girin

büyütülmüş:

görüntü tanımını buraya girin

(tüm gençler için: bu DEĞİL Madonna ;-)

[*] Büyütmeyi 75x75'e kadar saymadım (ilk satır) - girdi olarak zaten yeniden boyutlandırılmış olabilirdi. Umarım bu senin için iyidir.


Marilyn Monroe'ya tapıyorum ... Harika bir seçim ...
Yeniden

4

Postscript ve TRUE Rubik renkleri! ;-)

Eh, bu çözüm biraz konu dışı, biraz yüksek uzmanlık alanı ile sınırlı olduğu için. Ancak, örneğin "tuhaf sayılarla soru" (pratik olarak çalışan bir şey üretememek) ile ilgili çok sıkıntıdan sonra, bir şeyler yayınlamaya karar verdim ve bu yüzden bunu yarı mamul karalamalar kümesinden çıkardım ve kendini iyi hissettirdi.

Çözüm, bu sorunun ilk revizyonunun Pantone (R) renklerinin kullanılacağını açıkça belirten ve RGB renklerinin yalnızca yaklaşık olduğunu belirten bir siteye bağlanarak gerekli renkleri tanımladığı gerçeğinden faydalanır. Sonra gerçek renkleri yapabildiğim zaman neden yaklaşımlar yapmalıyım diye düşündüm. - :)

10 dict begin
/Size 75 def
/Names  [(PMS 012C) (PMS 021C) (PMS 347C)   (PMS 200C)    (PMS 293C)   ] def
/Colors [[0 .16 1 0][0 .65 1 0][1 0 .39 .38][0 .9 .72 .28][1 .56 0 .27]] def
<</PageSize [Size dup]>> setpagedevice
Size dup scale
true setoverprint
(%stdin) (r) file 100 string readline pop 
(r) file <</CloseSource true>>/DCTDecode filter
0 1000000 string 
dup <</CloseTarget true>>/NullEncode filter 
{
    3 index 3 string readstring
    {
        4 -1 roll 1 add 4 1 roll
        {} forall
        0.11 mul exch 0.59 mul add exch 0.3 mul add cvi
        1 index exch write
    } {pop exit} ifelse
} loop
closefile
0 3 -1 roll getinterval
exch closefile
/data exch def
/n data length sqrt cvi def
1 1 Names length {
    /N exch def
    { 
        dup N Names length 1 add div gt 
            {N 1 add Names length 1 add div gt 
                {1} {0} ifelse} 
            {pop 1} 
        ifelse
    } settransfer
    [/Separation Names N 1 sub get /DeviceCMYK {
        Colors N 1 sub get 
        { 1 index mul exch } forall pop
    }] setcolorspace
    <<
        /ImageType        1
        /Width            n
        /Height           n
        /ImageMatrix      [n 0 0 n neg 0 n]
        /BitsPerComponent 8
        /Decode           [0 1]
        /DataSource       data
    >> image
} for
showpage
end

Bu kod örn. Olarak kaydedilecek rubik.psve daha sonra normal şekilde kullanılabilecek şekilde Ghostscript'e yazılacak.

gs -q -sDEVICE=psdcmyk -o out.psd rubik.ps

Sonra JPG dosya adının girilmesi için sizi bir sonraki satırda bekler.

kelly.jpg

ve her şey yolunda giderse, çıktıyı out.psddosyaya kaydeder .

Girdi kare RGB JPEG (herhangi bir boyutta) olmalı, çıktı spot renk kanallarıyla PSD olmalıdır. Dosyayı görüntülemek için Photoshop'a ihtiyacınız olacak. GS cihazını psdcmykbaşka bir şeyle değiştirmek kullanılabilecek hiçbir şey üretmeyecektir. Giriş olarak JPEG - postscript yorumlayıcısı veri akışını doğrudan kodundan çözebilir. Kare şekli - programın dayandığı içinsqrt görüntünün genişliğini (ve yüksekliğini) bulmak için dize uzunluğuna .

İlk satırlar çıktı görüntüsü boyutunu (varsayılan 75'ten değiştirilebilir) ve renk paletini (renkler ve sayıları da değiştirilebilir) tanımlar. Başka bir şey kodlanmış değildir sanırım.

Neler oluyor? RGB üçüzlerinin akışı, anında gri tonlamalı değerler dizisine dönüştürülür (basit formülle), normal 8 bitlik contone görüntü sözlüğü oluşturulur ve birbirlerinin üzerine 5 Separationrenk boşluğundaki 5 görüntüyü boyamak için kullanılır . Hile, imageoperatörün her çağrılmasından önce transfer fonksiyonlarını uygulamaktır . Örneğin, sarı boya için bu işlev yalnızca 0.167 .. 0.333 aralığında giriş değerleri için 0, aksi halde 1 değerini döndürür.

Giriş:

görüntü tanımını buraya girin

Photoshop'ta açık 75x75 çıktısının ekran görüntüsü,% 800 oranında büyütülmüş:

görüntü tanımını buraya girin

Ve Photoshop kanal paleti:

görüntü tanımını buraya girin


1
Kelly'yi kullanmak için + 1 ... saygım tamamen
sizde

3

C #

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        unchecked
        {
            var t = new[] { 0xFFC41E3A, 0xFF009E60, 0xFF0051BA, 0xFFFF5800, 0xFFFFD500, 0xFFFFFFFF }.Select(v => Color.FromArgb((int)v)).ToArray();
            var o = new Bitmap(Bitmap.FromFile(args[1]));
            var m = double.Parse(args[0]);
            var r = Math.Min(m / o.Width, m / o.Height);
            var w = (int)(o.Width * r);
            var h = (int)(o.Height * r);

            o = new Bitmap(o, w - (w % 3), h - (h % 3));
            for (int y = 0; y < o.Height; y++)
                for (int x = 0; x < o.Width; x++)
                    o.SetPixel(x, y, N(o.GetPixel(x, y), t));
            o.Save(args[2], ImageFormat.Png);
        }
    }

    static Color N(Color c, Color[] t)
    {
        return t.OrderBy(v => Math.Abs(W(v) - W(c))).First();
    }

    static double W(Color c)
    {
        return .11 * c.B + .59 * c.G + .30 * c.R;
    }
}

3 parametreyle çalıştırmanız gerekir:

foo.exe 75 d:\test.jpg d:\out.png

75Max nerede ? width / height, d:\test.jpggirdi dosyası ve d:\out.pngçıktı dosyasıdır.

Bu yarışmada çeşitli görüntüler için çıktı:

WallyWest SztupY 1 SztupY 2 blabla999

Kendi ünlüsüm:

Garth!

Çıktı:

Garth 75 Garth 225

Ancak, diğer (75x75'ten büyük) boyutlar daha iyi görüntüler sağlar:

150 300

Ve eğer başkanlara sadık kalırsak:

DubbaYa 294 DubbaYa 75 DubbaYa 225

Bu (artık değil mi?) Codegolf olmadığından, kodu çok fazla "küçültmek" için uğraşmadım. Ayrıca, talimatlar görüntünün özel olarak belirtmediğinden, yükseklik (kare) ile aynı genişlikte olması gerektiğinden, kırpma ile uğraşmadım; Ben bunu emin görüntü genişliğinde 3 piksel / en yüksek katları yapmak, ancak,. Kare görüntüler istiyorsanız kare girişleri kullanın : P. algoritma optimal olmaktan uzak.

Birkaç kişi daha (insanlar ateşli piliçleri / internet kahramanlarını daha fazla yer değiştirdiğinden beri : P)

Kari Byron 300 Kari Byron 75 Kari Byron 225 Hoff 300 Hoff 75 Hoff 225


3

brainfuck

++++[->+[,.----------]<]>>>>---->->++++++++++>>------------>+++>+++>--
--->++++++[->+++++<]---->+[-<+++++++<+++<+++++<+++<+++<++++++<++++++<+
<++>>>>>>>>>]<[<]<<,+[,<++++++>[>++++++[->+++++++<]>+[<<[->]>[<]>-]<<<
->]+<[-[-[-[-[[-].>>>>>>>>.<.<<<<<<-<]>[->>>>>[.<]<<]<]>[-.>>>[>]<<<.<
.[<]<<]<]>[--.+>>>[>]<<.[<].<<]<]>[--.+>>>[>]<.[<].<<]<]>[--...+],,+]

Bu, EOF olarak -1 olan ve kırmızı piksellerden birinin 255 olması durumunda 8 bit hücreden daha yüksek olan bir BF yorumlayıcısı / derleyici gerektirir. Ya da EOF ile 0xFF değeri arasında değişiklik yapamayacağı için erken durur. . Jitbf ile makinenin tamsayı büyüklüğü kadar her şeye sahip olursunuz ve bunu -1'i EOF kadar zorlamak için yapabilirsiniz:

jitbf --eof -1 rubiks.bf < angelina.pnm > angelina-rubix.pnm

Oluşturulan görüntü dosyası formatı, Gimp'deki seçenek olarak raw olan tam RGB PNM dosyasıdır (P6).

Yalnızca yeşil kanalı kullanır (renkli bir görüntüyü gri tonlamaya dönüştürmenin birçok yolundan biridir). Hangi rubiks renginin kullanılacağını bulmak için sıfırın altındaki değeri düşürmeden değeri 43'e düşürür ve karşılık gelen doğru RBG rengini basan bir anahtara sahip olur.

Hackers'dan (1995) Angelina Jolie'nin görüntüsü 75x75'e kadar ölçeklendi ve uygulama ile işlendi:

Angelina Jolie 75x75 / Adil Kullanım Rubik küpü renklerinde Angelina Jolie 75x75 / Adil Kullanım Aynı ölçekli 6x

Aynı, sadece orijinal boyutunu kullandım :

Aynısı ilk önce küçültülmüş değil / Adil kullanım

Psişik olduğum için burada da bir başkan var:

Arnold Schwarzenegger Vikipedi'den CC


Konu dışı, ama bugünün xkcd'sinin Hacker (1995)
Sylwester

1
Bu da yapar: xkcd.com/1247
Gölge

1

Objective-C

Dün gece bu meydan okumayı gördüm ve bu -[NSArray indexOfObject:inSortedRange:options:usingComparator:]yüzden gecikme ile hiç bu kadar kafa karıştırıcı bir zaman geçirdim .

- (UIImage  *)rubiksImage:(UIImage *)inputImg
{
    //Thank you http://stackoverflow.com/a/11687434/1153630 for the greyscale code
    CGRect imageRect = CGRectMake(0, 0, inputImg.size.width, inputImg.size.height);

    int width = imageRect.size.width;
    int height = imageRect.size.height;

    uint32_t *pixels = (uint32_t*)malloc(width * height * sizeof(uint32_t));

    memset(pixels, 0, width * height * sizeof(uint32_t));

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast);

    CGContextDrawImage(context, imageRect, [inputImg CGImage]);

    const int RED = 1;
    const int GREEN = 2;
    const int BLUE = 3;

    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            uint8_t* rgbaPixel = (uint8_t*)&pixels[y * width + x];
            uint32_t grayPixel = 0.3 * rgbaPixel[RED] + 0.59 * rgbaPixel[GREEN] + 0.11 * rgbaPixel[BLUE];

            NSArray *r = [self rubixColorFromGrey:grayPixel];

            rgbaPixel[RED] = [r[2] integerValue];
            rgbaPixel[GREEN] = [r[1] integerValue];
            rgbaPixel[BLUE] = [r[0] integerValue];
        }
    }

    CGImageRef newCGImage = CGBitmapContextCreateImage(context);

    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    free(pixels);

    UIImage* newUIImage = [UIImage imageWithCGImage:newCGImage];

    CGImageRelease(newCGImage);

    return newUIImage;
}

- (NSArray *)rubixColorFromGrey:(uint32_t)p
{
    NSArray *colors = @[@0, @51, @102, @153, @204, @255];

    NSUInteger index = [colors indexOfObject:@(p)
                               inSortedRange:NSMakeRange(0, colors.count)
                                     options:NSBinarySearchingInsertionIndex | NSBinarySearchingFirstEqual
                             usingComparator:^(id a, id b) {
                                return [a compare:b];
                             }];
    switch (index) {
        case 0:
            return rgb(0, 81, 186);
            break;
        case 1:
            return rgb(196, 30, 58);
            break;
        case 2:
            return rgb(0, 156, 96);
            break;
        case 3:
            return rgb(255, 82, 0);
            break;
        case 4:
            return rgb(255, 213, 0);
            break;
        case 5:
            return rgb(255, 255, 255);
            break;

        default:
            break;
    }

    return colors; //go wild
}

NSArray *rgb(int r, int g, int b)
{
    return @[@(r), @(g), @(b)];
}

İPad'imde şöyle koştum:

UIImageView *img = [[UIImageView alloc] initWithImage:[self rubiksImage:[UIImage imageNamed:@"danny.png"]]];
[img setCenter:self.view.center];
[self.view addSubview:img];

Önce Danny DeVito Önce sonra Danny DeVito Sonra

Önce Grace Kelly Önce sonra Grace Kelly sonra


1

piton

Biçim: python rubik.py <input> <max_cubes> <output>.

Önerilen algoritmayı kullanarak pikseli gri tonlamaya alır.

import Image, sys

def rubik(x, max_cubes = 25):

    img = x
    max_cubes *= 3

    if x.size[0] > max_cubes or x.size[1] > max_cubes:

        print "Resizing image...",

        if x.size[0] > x.size[1]:
            img = x.resize((max_cubes, int(max_cubes * float(x.size[1]) / x.size[0])), Image.ANTIALIAS)
        else:
            img = x.resize((int((max_cubes * float(x.size[0]) / x.size[1])), max_cubes), Image.ANTIALIAS)

    if x.size[0] % 3 or x.size[1] % 3:
        print "Sizes aren't multiples of 3"
        return

    print "Image resized to %i x %i pixels" % img.size

    out = Image.new('RGB', img.size)

    print "Converting image...",

    for x in xrange(out.size[0]):
        for y in xrange(out.size[1]):
            r, g, b = img.getpixel((x, y))
            if r == g == b == 255:
                out.putpixel((x,y), (255, 255, 255))
            else:
                l = 0.2126 * r + 0.7152 * g + 0.0722 * b
                l /= 255
                out.putpixel((x,y), (
                        (0x00, 0x51, 0xBA),
                        (0xC4, 0x1E, 0x3A),
                        (0x00, 0x9E, 0x60),
                        (0xFF, 0x58, 0x00),
                        (0xFF, 0xD5, 0x00)
                    )[int(5 * (l <= 0.0031308 and 12.92 * l  or 1.055 * l ** (1/2.4) - 0.055))])

    print "Image converted successfully."

    print "Stats:"
    h, v = img.size[0] / 3, img.size[1] / 3
    print "   ", h, "horiz. Rubik cubes"
    print "   ", v, "vert. Rubik cubes"
    print "   ", h * v, "total Rubik cubes"

    return out.resize((out.size[0], out.size[1]))

if __name__ == "__main__":
    rubik(Image.open(sys.argv[1]).convert("RGB"), int(sys.argv[2])).save(sys.argv[3])

Giriş:

Sandro Pertini
(kaynak: ilmamilio.it )

Çıkış max_cubes = 25:

Sandro Pertini, Rubik 1

Çıkış max_cubes = 75:

Sandro Pertini, Rubik 2

Çıkış max_cubes = 225:

Sandro Pertini, Rubik 3


Beyaz renk eksik değil mi? Ve en karanlık mavi olmalı, ama şimdi gördüğüm gibi, başka görüntülerde de sorun bu.
user2846289

@VAdimiR Whoops! Onları yanlış sırada eşleştirdi. Beyaz görünmüyorsa, FP hassasiyetinden kaynaklanmaktadır (1.055 - 0.055 = 0.99999999999999). Sanırım, sadece #FFFFFF'ın orijinal bir değerinde göründüğü için zor olmayan beyaza kod yazmam gerekecek.
Oberon

Beyaz hakkında, benim görüşüm 0..1 (hafiflik) aralığının 6 parçaya bölündüğü ve 0.83..1.00 olan herhangi bir şeyin beyazla eşleştirildiği veya aksi takdirde küpün 6 ​​renginin resmini çizmenin pek bir anlamı olmayacağı kanaatindeydim. , ama böyle okudum.
user2846289

@Oberon Pertini'yi kullanarak ilginç bir seçim ... Neredeyse 94 yaşına kadar yaşadı ... Python'u kullanarak da harika bir iş çıkardın ve kabul etmeliyim ki, rastladığım en kolay dillerden biri değil, çok başarılı!
WallyWest
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.