How to generate the image with grayscale and different bitdepth in java?
Я пытаюсь реализовать некоторый код Java, который может помочь отрегулировать изображение PNG на основе некоторых характеристик изображения PNG: например, Разрешенный цвет Тип интерпретации Бит Глубины
0 1,2,4,8,16 Каждый пиксель представляет собой образец в градациях серого.
Из которого я искал, что если тип цвета равен 0, я должен реализовать код, основанный на разной битовой глубине: 1, 2, 4, 8, 16, для шкалы серого.
Я хочу использовать библиотеку Graphic2D, поэтому я думаю:
if (img_bitDepth == 16) {
type = BufferedImage.TYPE_USHORT_GRAY; // 11
} else if (img_bitDepth == 8) {
type = BufferedImage.TYPE_BYTE_GRAY; //10
} else if (img_bitDepth == 4) {
type = BufferedImage.TYPE_BYTE_BINARY;
} else if (img_bitDepth == 2) {
type = BufferedImage.TYPE_BYTE_BINARY;
} else if (img_bitDepth == 1) {
type = BufferedImage.TYPE_BYTE_BINARY;
} else {
//logger warning.
}
BufferedImage resizedImage = new BufferedImage (img_width, img_height, type);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(originalImage, 0, 0, img_width, img_height, null);
g.dispose();
Но я не знаю, как установить битовую глубину для 2 и 4 с типом изображения "TYPE_BYTE_BINARY".
Любое предложение?
1 ответ
Я пытаюсь использовать этот способ, кажется, работает.
private static final IndexColorModel createGreyscaleModel(int bitDepth) {
// Only support these bitDepth(1, 2, 4) for now: Set the size.
int size = 0;
if (bitDepth == 1 || bitDepth == 2 || bitDepth == 4) {
size = (int) Math.pow(2, bitDepth);
} else {
//logger error
return null;
}
// generate the rgb and set the greyscale color.
byte[] r = new byte[size];
byte[] g = new byte[size];
byte[] b = new byte[size];
// The size should be larger or equal to 2, so we firstly set the start and end pixel color.
r[0] = g[0] = b[0] = 0;
r[size-1] = g[size-1] = b[size-1] = (byte)255;
for (int i=1; i<size-1; i++) {
r[i] = g[i] = b[i] = (byte)((255/(size-1))*i);
}
return new IndexColorModel(bitDepth, size, r, g, b);
}
type = BufferedImage.TYPE_BYTE_BINARY;
IndexColorModel cm = createGreyscaleModel(img_bitDepth);
resizedImage = new BufferedImage (img_width, img_height, type, cm);
Благодарю.