Member 14612043 Ответов: 1

Как преобразовать изображение в оттенки серого, а затем в сепию на java?


Я выяснил, как преобразовать изображение в серую шкалу, однако у меня возникли проблемы с преобразованием изображения серой шкалы в сепию. Я предоставил код, используемый для преобразования изображения в серый масштаб. Я также предоставил код для преобразования изображения серой шкалы в сепию, но когда я включил его, он не компилировался.

Что я уже пробовал:

import images.APImage;
import images.Pixel;
import java.util.Scanner;

public class Sepia{

public static void main(String[]args){
	Scanner reader = new Scanner(System.in);
	APImage image = new APImage("Default.jpg");
      image.draw();
      for (Pixel p : image){
	int red = p.getRed();
	int green = p.getGreen();
	int blue = p.getBlue();
	int average = (red + green + blue) / 3;
	 p.setRed(average);
	 p.setGreen(average);
	 p.setBlue(average);
}
 
		//Causes program to wait to draw the image
		System.out.print("Press return to continue:");
		reader.nextLine();
 
		//Draw the image again
		image.draw();
	}
 
 
}

Код для преобразования изображения из серой шкалы в сепию выглядит следующим образом;
//set image from grayscale to sepia
if(red < 63) {
    red = (int)(red * 1.1);
    blue = (int)(blue *0.9);
}
    else if (red < 192) {
    red = (int)(red * 1.15);
    blue = (int) (blue * 0.85);
}
else {
    red = Math.min(int(red * 1.08), 255);
    blue = (int)(blue * 0.93);
}

Patrice T

А что говорит компилятор ?

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Gerry Schmitz

Значит, вы уволились из "Блю = "? А как насчет дополнительного кода, который вы сделали для "серой шкалы"? Не видишь родственника?

1 Ответов

Рейтинг:
1

Catey Category

У меня есть алгоритм, который превращает 32-битные цвета (argb, 8 бит на канал) в цвета сепии в том же формате. Этот алгоритм игнорирует альфа-канал и возвращает цвета полной непрозрачности. Я добавил несколько комментариев, чтобы прояснить, что делает конвертер.

По сути, он извлекает 8-битные цвета R, G и B из целого числа. Класс пикселей, который вы использовали, по-видимому, уже имеет эти данные. затем он превращает их в поплавки, а затем интерполирует каждый цвет в сепиевые тона. Наконец, он компилирует полученные 8-битные каналы обратно в 32-битное целое число.

public static int toSepia(int color)
{
	// extract 8-bit color channels
	int i_r = (color>>16)&0xff;
	int i_g = (color>>8)&0xff;
	int i_b = (color)&0xff;
	
	// turn int rgb to float rgb
	float r = (float)i_r;
	float g = (float)i_g; 
	float b = (float)i_b;
	
	// compile new rgb, basically a 3x3 matrix operation
	float newr 	= (r * .393f) + (g *.769f) + (b * .189f);
	float newg 	= (r * .349f) + (g *.686f) + (b * .168f);
	float newb 	= (r * .272f) + (g *.534f) + (b * .131f);
	
	// round floats to integers
	int o_r = (int)(newr+0.5f);
	int o_g = (int)(newg+0.5f);
	int o_b = (int)(newb+0.5f);
	
	// clamp result
	o_r = (o_r>255)?255:o_r;
	o_g = (o_g>255)?255:o_g;
	o_b = (o_b>255)?255:o_b;
		
	// turn back to 32-bit int format
	return (255<<24) | (o_r<<16) | (o_g<<8) | (o_b);
}

В вашем случае вместо того, чтобы возвращать 32-битное целое число, возможно, ваш метод возвращает новый пиксельный объект с новыми цветовыми данными. Как/если вы включаете этот код, конечно, зависит от вас.

Надеюсь, это вам поможет. Овации