Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Oyun Resimlerinin PNG Biçimine Dönüştürülmesi #3

Closed
maidis opened this issue Jan 29, 2019 · 5 comments
Closed

Oyun Resimlerinin PNG Biçimine Dönüştürülmesi #3

maidis opened this issue Jan 29, 2019 · 5 comments

Comments

@maidis
Copy link

maidis commented Jan 29, 2019

Dinozorus'un tam bir yeniden yapımını (remake) olmasa bile Chrome'un T-Rex oyununun bir uyarlamasını yapmak istiyorum hobi amaçlı olarak. Ama birkaç deneme yapmama rağmen görselleri işleyip kullanmak istediğim biçime çevirecek bir yol bulamadım. Yanlış denizlerde yüzmediğimden emin olmak için oyunda kullanılan resim biçimleri hakkında kısa da olsa biraz bilgi verebilir misiniz? Bir biçim ismi veya kullanılabilecek program ismi bile çok büyük bir ipucu olur benim için.

@vigo
Copy link
Owner

vigo commented Jan 30, 2019

Anıl selamlar... resimler RAW formatında. yanlış hatırlamıyorsam sol üstten başlayıp r,g,b olarak renkler var... sıkıntı şu, diyelim resim 10pixel x 10pixel... elinde 00,00,00,00,FF,00..... var 3'lü olarak aldın, örneğe göre 000000,00FF00....... 10 tane olduğunda ilk satırı elde ettin. assembly code'dan bakıp imajların width/height'ı bulmamız lazım... ki sen kaça kaç resmi oluşturacaksın raw'dan...

@maidis
Copy link
Author

maidis commented Feb 3, 2019

Merhaba,

Boyutu en küçük raw dosyası sadekafa.raw üzerinde biraz çalışma yaptım ama henüz istediğim sonucu elde edemedim.

Kısaca yaptıklarım şöyle: ilk önce dosya boyutuna baktım: 544 byte = 4352 bit. Kaynak koddan yanlış yorumlamadıysam resmin çözünürlüğü = 32x34 piksel. Genişliğin ve yüksekliğin çarpımı 1088 yapıyor. Dosya boyutunu bu çarpıma böldüğümüzde = 4352 / 1088 = 4 sonucuna ulaşıyoruz.

Burada iki olasılık var, ya her bir pikseli tanımlamak için 4 bit kullanılmış, ya da her bir renk kanalındaki pikselin kırmızı, yeşil, mavi ve alfa değerleri için 1 bit kullanılmış.

İlk seçenek olabilir mi diye epey bir deneme yaptım. Bunların hepsini RGB veya RGBA varsayımıyla yaptım ama düzgün bir sonuç elde edemedim. Bu satırları yazarken indexed color'ı neden denemediğimi düşündüm, bununla ilgili de deneme yapacağım. Belki, includes/color içindeki palet dosyalarını da kullanarak doğru sonuca ulaşabilirim.

İkinci seçeneğin doğru yol olduğunu varsayarsak resim dosyasını 1088'er bit olarak R, G, B ve A kanallarından oluşturabiliyoruz. Bu şekilde resmin ana hattına neredeyse tam olarak ulaşabiliyoruz ama renkler yanlış.

Biraz değiştirilmiş halini birinci olasılık için de kullandığım kod parçası şöyle:

bool ok;
    QString hadi = "00000011111110000000000000000000000011111111111100000000000000000000111111111111100000000000000000001011111111111100000000000000000010111111111111100000000000000000010111111111111000000000000000000101111111111111000000000000000001011111111111111000000000000000001011111111111110000000000000000010111111111111110000000000000000101111111111111100000000000000001011111111111111000000000000000010111111111111111100000000000000101111111111111111110000000000001011111111000001111110000000001111111111010000001111110000000111111100000110000001111110000011111110000000110000011111100001111111100000000000000111111000011111111000000000000001111000001111111110000000000010011101000011111100100000000001100111100000000100101000100000111000101100001101000001011000000000000011000000110000001000000101000100011000011011000000000000000010100010001100000010000000001000000001000010001001101000001001000100100000100101010000000000000000010000000110010010100000000000001000000010000010000000000000000100000000000000010000001000000010000000000000000011000000000011000000000000000000001111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000001000000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000001000000001111100000000000000000000000000111111100000000000000000000111110111111100000000000000000011111110111111000000000000000001111111110111110000000000000000011111111101111100001100000000000111111111011111000100000000000001111111110111100000000001110011011111111101110110100000000000101011111110100011110000000000001111011111011101101010000000001000011000001011010111101000000111000100011100100111101001000011100011110000000001101010000000110000111000000000000001000000010000000111001111111000000000000000000000001100000000000000000000000000000000001111000000000000000000000001111011110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000001000000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000100000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000001000000000000000000000000000000010000000001111100000000000000000100000000100000100000000000000000000111111000000100000000000000000010000011000000100000000000000001000000011000001000000000000000110000000010000010000000000000001100000000100000100000000000000011000000001011001000100000000011110000000010110100010000000001011100110000111111110000000111111111101100011111111110000000001111111100001111111010110000000001010111111110101101011100000000001001000111001111100011100000000110110100000111111110100000000011001001000000000010011000000011110001011111111111000100000001000001000011111111100010000000000000001000000000000001000000000000000001111111000001100000000000000000000111111111100000000000000000011111110000000000000000000000011111111111100000000000000000000011111111111100000000000000000000111111111111100000000000000000001111111111111100000000000000000001111111111111000000000000000000011111111111111000000000000000000111111111111111000000000000000000111111111111110000000000000000001111111111111110000000000000000011111111111111100000000000000000111111111111111000000000000000001111111111111111100000000000000011111111100000111110000000000000111111110000000111110000000001111110000000000000111110000000111111000000000000000111110000011111100000000000000001111100001111110000000000000000011111000011111100000000000000000111110001111111000000000000110001110000011111000000000000001100111000000111100000001100000000000011100000000000000011000000000000011000000100000000000000000001010011000011100010000000010000100000110001111101101110001100000001000100011110010000111110000000010000000111000100001111111111011000000001000001100000000000001110000000000000001111000000000111000000000000000001111110000011100000000000000000000000000000100000000000000000000000000000000000000000000";

    std::vector<unsigned char> red;
    std::vector<unsigned char> green;
    std::vector<unsigned char> blue;
    std::vector<unsigned char> alpha;

    int i = 0;
    while(i < 32*34*4)
    {
        QString str1 = hadi.mid(i, 1);
        QString str2 = hadi.mid(32 * 34 + i, 1);
        QString str3 = hadi.mid(32 * 34 + 32 * 34 + i, 1);
        QString str4 = hadi.mid(32 * 34 + 32 * 34 + 32 * 34 +i, 1);

        int iVal1 = str1.toInt(&ok,2);
        int iVal2 = str2.toInt(&ok,2);
        int iVal3 = str3.toInt(&ok,2);
        int iVal4 = str4.toInt(&ok,2);
        if (i < 64) {
            qInfo() << "red" << i << str1 << '\n';
            qInfo() << "red" << i << iVal1 << '\n';
            qInfo() << "green" << i << str2 << '\n';
            qInfo() << "green" << i << iVal2 << '\n';
            qInfo() << "blue" << i << str3 << '\n';
            qInfo() << "blue" << i << iVal3 << '\n';
            qInfo() << "alpha" << i << str4 << '\n';
            qInfo() << "alpha" << i << iVal4 << '\n';
        }
        red.push_back(iVal1);
        green.push_back(iVal2);
        blue.push_back(iVal3);
        alpha.push_back(iVal4);
        //qInfo() << "red" << i / 4 << ": " << iVal;
        i = i + 1;
    }
    QImage image(32, 34, QImage::Format_ARGB32);
    int l = 0;
    int x = 0;
    int y = 0;
    do
    {
        image.setPixel(x, y, qRgba(red.at(l)*255, green.at(l)*255, blue.at(l)*255, alpha.at(l)*255));
        x = x + 1;
        if (x == 32)
        {
            x = 0;
            y = y +1;
        }
        l = l + 1;

    } while(l < 32 *34);

    QPixmap a;

    a.convertFromImage(image);
    ui->label->setPixmap(a.scaled(320, 340));

hadi değişkeninin içindekiler, Okteta ile sadekafa.raw'dan okunan binary değerler. Bununla elde edilen sonuç ve görselin asıl hali şöyle:

GIMP ile dosya yapısı hakkında daha çok bilgi edinmek için biraz inceleme yaptım:

Belki gözümden kaçan bir şey vardır, ama henüz göremedim.

Ekleme: Renk modeli olarak CMYK kullanılmıyordur ama dördüncü kanala K gibi davranmak resmin ana hatlarının tam olarak doğru çıkarılmasını sağladı. Bu da dördüncü kanalın alfa olmadığını söylüyor sanırım.

        //image.setPixel(x, y, qRgba(red.at(l)*255 * 0.33, green.at(l)*255*0.6, blue.at(l)*255*0.11, alpha.at(l)*255));

        QColor renk = QColor::fromCmyk(red.at(l)*255, green.at(l)*255, blue.at(l)*255, alpha.at(l)*255);

        image.setPixel(x,y,renk.rgba());

Wikipedia'daki planner maddesi epey aydınlatıcı oldu benim için. Şimdilik RGB muamelesi yaptım ama dört plane olarak davranıp palet dosyalarından karşılık gelen renkleri doğru şekilde alabilirsem orijinallerdeki renklerin aynısını alabileceğim:

...
    std::vector<unsigned char> dortlu;
...
        QString string = str1 + str2 + str3 + str4;
        int ival = string.toInt(&ok, 2);
...
        dortlu.push_back(ival);
...
image.setPixel(x, y, qRgb(dortlu.at(l)*17 * 0.33, dortlu.at(l)*17*0.6, dortlu.at(l)*255*0.11));
...

@maidis
Copy link
Author

maidis commented Feb 5, 2019

Biraz uğraştırdı ama sonunda başardım ve grafiklerle ilgili daha önce bilmediğim (Chunky vs. Planar gibi) şeyler öğrendim. Kodu temizleyip daha işe yarar bir hale getireceğim. Kafamdaki düşünce şu:

  • Dosya boyutunu bit olarak al
  • Dosya boyutunun tüm çarpanlarını bul, böylece resmin tüm olası çözünürlüklerini elde et ( https://www.calculatorsoup.com/calculators/math/factors.php )
  • Tüm paletleri bir vector içinde tut
  • bütün çözünürlüklerdeki resim dosyalarını bütün palet dosyalarıyla ayrı ayrı oluştur

Kullanıcıya tek bir iş kalacak bu çözümde. O da yanlış çözünürlükteki ve renklerdeki resimleri sonradan silmek. Bu da çok zor olmayacaktır ama.

https://paste.ubuntu.com/p/pN2yGv4w25/

@vigo
Copy link
Owner

vigo commented Jun 25, 2020

eline sağlık... hatta bunu bi commandline tool haline getirelim, macOS homebrew paketi yapalım?

@maidis
Copy link
Author

maidis commented Jun 25, 2020

Sizlerin eline sağlık @vigo :)

Elimizde şu an şöyle bir şey var:

https://github.com/maidis/rawosaurus

Bu programda benim tekrarlayabildiğim bir sorun var ama üzerine düşemedim bir türlü.

@vigo vigo closed this as completed Apr 24, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants