Как изменить цвет пикселя и увеличить изображение в N раз

199
10 марта 2018, 19:11

Доброго времени суток! Есть задачка: "В исходных файлах clue.bmp и mrBody.png скрыты изображения. В исходных изображениях точки с цветом 0xFF0000 (красный) являются шумом, который скрывает реальное изображение. Напишите программу, которая покажет, кто же спрятан в исходных файлах."

Дополнительным условием к задаче стало увеличения очищенного изображения в 2 раза.

Убрать шум труда не составило, но вот с увеличением проблема. Как мне объяснили, нужно: "В новый файл нужно вместо одной точки писать две размазывая ее цвета. Например, в исходном файле у нас есть точка с цветами RGB В результирующем должно быть две точки в которой цвета из исходной точки распределятся вот так RRG GBB". Код прилагаю.

File file = new File("mrBody.png");
BufferedImage sourceImage = ImageIO.read(file);
int width = sourceImage.getWidth();
int height = sourceImage.getHeight();
int red = Color.RED.getRGB();
int white = Color.WHITE.getRGB();
for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        if (sourceImage.getRGB(x, y) == red) {
            sourceImage.setRGB(x, y, white);
        }
    }
}
BufferedImage result = new BufferedImage(width * 2, height * 2, sourceImage.getType());
for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        Color color = new Color(sourceImage.getRGB(x, y));
        int r = color.getRed();
        int g = color.getGreen();
        int b = color.getBlue();
        Color c1 = new Color(r, r, g);
        Color c2 = new Color(g, b, b);
        result.setRGB(x*2, y*2, c1.getRGB());               
        result.setRGB((x*2)+1, y*2, c2.getRGB());   
        result.setRGB(x*2, (y*2)+1, c1.getRGB());
        result.setRGB((x*2)+1, (y*2)+1, c2.getRGB());
    }
}
ImageIO.write(result, "png", new File("result.png"));
Answer 1

Если я правильно вас понял, то вам нужно использовать что-то подобное:

try
{
    File file = new File("file.png");
    BufferedImage img = ImageIO.read(file);// Любое другое изображение
    BufferedImage image = new BufferedImage(img.getWidth() * 2, img.getHeight() * 2, BufferedImage.TYPE_INT_RGB);// Новое изображение
    image.getGraphics().drawImage(img.getScaledInstance(image.getWidth(), image.getHeight(), Image.SCALE_SMOOTH), 0, 0, null);// На новом рисуем увеличенное старое
    ImageIO.write(image, "PNG", file);
}
catch (IOException e)
{
    e.printStackTrace();
}
READ ALSO
Primefaces onemenu не передает объект

Primefaces onemenu не передает объект

Не происходит сохранения студента, при выбранном универе, причем когда можно оставить поле univer пустым, все отлично сохраняет

127
Не могу понять почему возникает IndexOutOfBoundsException

Не могу понять почему возникает IndexOutOfBoundsException

При работе этого кода возникает IndexOutOfBoundsException, хотя индекс никак не может выходить за пределы arrayList:

171
Когда следует использовать интерфейсы

Когда следует использовать интерфейсы

Столкнулся с тем, что часто в системах объявляют интерфейсы для каждого класса из слоёв service or repositoryСоответственно каждый интерфейс имеет...

173