Chupo
2017-07-10 03:46:14 UTC
Ukratko:
Da li u Java-i postoji mehanizam za citanje color offset-a za svaki
pojedinacni pixel u indexed color .bmp file-u?
Opsirnije:
Napravio sam generiranje tile i sprite ROM file-ova za Pac-Man hardware
koji kao ulaz uzima 4 bpp (16 color) .bmp file. Pac-Man hardware ima
tile-ove i sprite-ove definirane s 2 bita po pixelu ali s obzirom da ne
postoji 2 bpp .bmp koristim 4 bpp .bmp file u kojem sam definirao samo
prva 4 unosa za paletu.
Problem je jer za citanje boje pixela koristim getRGB() metodu pa sam
boje morao hardkodirati. Kada bih umjesto RGB komponenti za pojedini
pixel mogao procitati offset u color paleti, onda boje ne bi morale
biti hardkodirane pa bi program radio s .bmp file-ovima koji su
nacrtani korisnjem bilo koje 4 boje.
Da li u Java-i postoje neke motode s kojima bi mogo doci do offset-a na
color paletu koji opisuje svaki pixel ili je jedini nacin da citam .bmp
file header i raspakiram pixel array?
Trenutno sam u .bmp file-u na offset-u 0x36 (color paleta) stavio:
00000036h: 00 00 00 00 FF FF FF 00 00 00 FF 00 FF 00 00 00
To su 4 boje, svaka boja je opisana s 4 byte-a u formatu BGRA pa je to:
0x00 crna
0x01 bijela
0x02 plava
0x03 crvena
Ako za crtanje koristim te 4 boje onda mogu na osnovu RGB vrijednosti
pixela odrediti offset u toj paleti, ali ako bi htio koristiti neke
druge 4 boje onda bih morao mijenjati program pa mi zato umjesto
citanja RGB vrijednosti pixela treba citanje offset-a u color paleti.
Program koji radi s hardkodiranim vrijednostima izgleda ovako:
package pacman;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import javax.imageio.ImageIO;
// Reads tile.bmp, generates raw output.bin and overwrites the
// first 16 bytes in pacman.5e ROM file with the same 16 bytes
public class Tilegen {
// returns byte describing 4 pixel column at position i
// i = 0 --> down-right, i = 15 --> up-left
public static int get4px(int i, int data[][]) {
int x;
int y;
int out = 0;
x = 7 - (i % 8); // x coord in array
y = 7 - (i / 8)*4; // y coord in array
// bits 0 & 4 (bit 0 and bit 1 shifted to position 4)
out |= (data[x][y] & 0x01) | ((data[x][y] & 0x02) << 3);
// bits 1 & 5 (bit 0 shifted to position 1 and bit 1 shifted to
position 5)
out |= ((data[x][y-1] & 0x01) << 1) | ((data[x][y-1] & 0x02)
<< 4);
// bits 2 & 6 (bit 0 shifted to position 2 and bit 1 shifted to
position 6)
out |= ((data[x][y-2] & 0x01) << 2) | ((data[x][y-2] & 0x02)
<< 5);
// bits 3 & 7 (bit 0 shifted to position 3 and bit 1 shifted to
position 7)
out |= ((data[x][y-3] & 0x01) << 3) | ((data[x][y-3] & 0x02)
<< 6);
return out;
}
public static void main(String[] args) throws IOException {
final File file = new File("tile.bmp"); // 8x8 .bmp
file (4 of 16 colors used)
final BufferedImage image = ImageIO.read(file);
final FileOutputStream outfile = new FileOutputStream
("output.bin"); // output hex file
final File romfile = new File("pacman.5e"); // ROM file
final RandomAccessFile tilerom = new RandomAccessFile(romfile,
"rw");
tilerom.seek(0L);
int data[][] = new int[8][8]; // to store pixel data
int out;
for (int y=0; y < image.getHeight(); y++) {
for (int x=0; x < image.getWidth(); x++) {
final int color = image.getRGB(x, y);
final int red = ((color & 0x00ff0000) >> 16); //
removing ( ) breaks auto indentation in Eclipse!?
final int green = ((color & 0x0000ff00) >> 8); //
removing ( ) breaks auto indentation in Eclipse!?
final int blue = color & 0x000000ff;
if ((red == 0xff) && (green == 0xff) && (blue == 0xff))
{
//System.out.print("1 "); // white is 1
out = 1;
} else if (red == 0xff) {
//System.out.print("3 "); // red is 3
out = 3;
} else if (blue == 0xff) {
//System.out.print("2 "); // blue is 2
out = 2;
} else {
//System.out.print("0 "); // black is 0
out = 0;
}
System.out.print(out + " ");
data[x][y] = out & 0xff;
}
System.out.println();
}
System.out.println();
// map data to ROM file format
for (int i=0; i < 16; i++) {
out = get4px(i, data);
System.out.println(out + " ");
outfile.write(out);
tilerom.write(out); // change byte in the ROM file
}
tilerom.close();
outfile.close();
} // main
} // class
Jos opsirnije:
https://stackoverflow.com/q/44991780/1324175
Da li u Java-i postoji mehanizam za citanje color offset-a za svaki
pojedinacni pixel u indexed color .bmp file-u?
Opsirnije:
Napravio sam generiranje tile i sprite ROM file-ova za Pac-Man hardware
koji kao ulaz uzima 4 bpp (16 color) .bmp file. Pac-Man hardware ima
tile-ove i sprite-ove definirane s 2 bita po pixelu ali s obzirom da ne
postoji 2 bpp .bmp koristim 4 bpp .bmp file u kojem sam definirao samo
prva 4 unosa za paletu.
Problem je jer za citanje boje pixela koristim getRGB() metodu pa sam
boje morao hardkodirati. Kada bih umjesto RGB komponenti za pojedini
pixel mogao procitati offset u color paleti, onda boje ne bi morale
biti hardkodirane pa bi program radio s .bmp file-ovima koji su
nacrtani korisnjem bilo koje 4 boje.
Da li u Java-i postoje neke motode s kojima bi mogo doci do offset-a na
color paletu koji opisuje svaki pixel ili je jedini nacin da citam .bmp
file header i raspakiram pixel array?
Trenutno sam u .bmp file-u na offset-u 0x36 (color paleta) stavio:
00000036h: 00 00 00 00 FF FF FF 00 00 00 FF 00 FF 00 00 00
To su 4 boje, svaka boja je opisana s 4 byte-a u formatu BGRA pa je to:
0x00 crna
0x01 bijela
0x02 plava
0x03 crvena
Ako za crtanje koristim te 4 boje onda mogu na osnovu RGB vrijednosti
pixela odrediti offset u toj paleti, ali ako bi htio koristiti neke
druge 4 boje onda bih morao mijenjati program pa mi zato umjesto
citanja RGB vrijednosti pixela treba citanje offset-a u color paleti.
Program koji radi s hardkodiranim vrijednostima izgleda ovako:
package pacman;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import javax.imageio.ImageIO;
// Reads tile.bmp, generates raw output.bin and overwrites the
// first 16 bytes in pacman.5e ROM file with the same 16 bytes
public class Tilegen {
// returns byte describing 4 pixel column at position i
// i = 0 --> down-right, i = 15 --> up-left
public static int get4px(int i, int data[][]) {
int x;
int y;
int out = 0;
x = 7 - (i % 8); // x coord in array
y = 7 - (i / 8)*4; // y coord in array
// bits 0 & 4 (bit 0 and bit 1 shifted to position 4)
out |= (data[x][y] & 0x01) | ((data[x][y] & 0x02) << 3);
// bits 1 & 5 (bit 0 shifted to position 1 and bit 1 shifted to
position 5)
out |= ((data[x][y-1] & 0x01) << 1) | ((data[x][y-1] & 0x02)
<< 4);
// bits 2 & 6 (bit 0 shifted to position 2 and bit 1 shifted to
position 6)
out |= ((data[x][y-2] & 0x01) << 2) | ((data[x][y-2] & 0x02)
<< 5);
// bits 3 & 7 (bit 0 shifted to position 3 and bit 1 shifted to
position 7)
out |= ((data[x][y-3] & 0x01) << 3) | ((data[x][y-3] & 0x02)
<< 6);
return out;
}
public static void main(String[] args) throws IOException {
final File file = new File("tile.bmp"); // 8x8 .bmp
file (4 of 16 colors used)
final BufferedImage image = ImageIO.read(file);
final FileOutputStream outfile = new FileOutputStream
("output.bin"); // output hex file
final File romfile = new File("pacman.5e"); // ROM file
final RandomAccessFile tilerom = new RandomAccessFile(romfile,
"rw");
tilerom.seek(0L);
int data[][] = new int[8][8]; // to store pixel data
int out;
for (int y=0; y < image.getHeight(); y++) {
for (int x=0; x < image.getWidth(); x++) {
final int color = image.getRGB(x, y);
final int red = ((color & 0x00ff0000) >> 16); //
removing ( ) breaks auto indentation in Eclipse!?
final int green = ((color & 0x0000ff00) >> 8); //
removing ( ) breaks auto indentation in Eclipse!?
final int blue = color & 0x000000ff;
if ((red == 0xff) && (green == 0xff) && (blue == 0xff))
{
//System.out.print("1 "); // white is 1
out = 1;
} else if (red == 0xff) {
//System.out.print("3 "); // red is 3
out = 3;
} else if (blue == 0xff) {
//System.out.print("2 "); // blue is 2
out = 2;
} else {
//System.out.print("0 "); // black is 0
out = 0;
}
System.out.print(out + " ");
data[x][y] = out & 0xff;
}
System.out.println();
}
System.out.println();
// map data to ROM file format
for (int i=0; i < 16; i++) {
out = get4px(i, data);
System.out.println(out + " ");
outfile.write(out);
tilerom.write(out); // change byte in the ROM file
}
tilerom.close();
outfile.close();
} // main
} // class
Jos opsirnije:
https://stackoverflow.com/q/44991780/1324175
--
Let There Be Light
Custom LED driveri prema specifikacijama
http://tinyurl.com/customleddriver
Chupo
Let There Be Light
Custom LED driveri prema specifikacijama
http://tinyurl.com/customleddriver
Chupo