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
Comments
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 |
Merhaba, Boyutu en küçük raw dosyası 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, İ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));
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));
... |
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:
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. |
eline sağlık... hatta bunu bi commandline tool haline getirelim, macOS homebrew paketi yapalım? |
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ü. |
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.
The text was updated successfully, but these errors were encountered: