Как добавить 20 пикселей белого в верхней части существующего файла изображения? - PullRequest
6 голосов
/ 11 августа 2011

У меня есть изображение размером w по h. В Java мне нужно создать изображение размером w на h+20, где верх w на 20 pixels белый, а остальная часть изображения совпадает с исходным изображением.

По сути, я хочу знать, как я могу добавить 20 пикселей белого в верхнюю часть существующего буферизованного изображения.

Так что это было бы что-то вроде:

public static void main (String[] args) {
  BufferedImage originalImage = [the original image with a specific file path];
    ...code to create a new image 20 pixels higher...
    ...code to paint originalImage 20 pixels down on the new image
    ...code to save the new image...
}

Ответы [ 3 ]

13 голосов
/ 11 августа 2011

Предложение:

  1. Используйте GraphicsConfiguration.createCompatibleImage(int width, int height), чтобы создать BufferedImage такой же ширины, но с высотой + 20.
  2. ИспользованиеBufferedImage.createGraphics(), чтобы получить Graphics2D объект этого изображения.
  3. Используйте Graphics.setColor(Color c) и Graphics.fillRect(int x, int y, int width, int height), чтобы нарисовать белыйtop
  4. Используйте Graphics.drawImage(Image img, int x, int y, ImageObserver observer), чтобы нарисовать исходное изображение с указанными координатами нового изображения.
  5. Чтобы сохранить новое изображение, прочитайте Запись /Сохранение изображения учебник.

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class ImageManipulationDemo {
    private static BufferedImage ORIGINAL;
    private static BufferedImage ALTERED;
    private static final GraphicsConfiguration config = 
        GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();

    public static void main(String[] args) {
        try {
            loadImages();

            SwingUtilities.invokeLater(new Runnable(){
                @Override
                public void run() {
                    createAndShowGUI();             
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void loadImages() throws IOException {
        ORIGINAL = ImageIO.read(
                ImageManipulationDemo.class.getResource("../resources/whitefro1.jpg"));
        ALTERED = config.createCompatibleImage(
                ORIGINAL.getWidth(), 
                ORIGINAL.getHeight() + 20);
        Graphics2D g2 = ALTERED.createGraphics();
        g2.setColor(Color.WHITE);
        g2.fillRect(0, 0, ALTERED.getWidth(), 20);
        g2.drawImage(ORIGINAL, 0, 20, null);
        g2.dispose();

        // Save image
        ImageIO.write(ALTERED, "PNG", new File("alteredImage.png"));
    }

    private static void createAndShowGUI() {
        final JFrame frame = new JFrame("Image Manipulation Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setBackground(Color.BLUE.darker());
        frame.getContentPane().setLayout(new FlowLayout());
        frame.getContentPane().add(new JLabel(new ImageIcon(ORIGINAL)));
        frame.getContentPane().add(new JLabel(new ImageIcon(ALTERED)));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

enter image description here

2 голосов
/ 11 августа 2011

Да, это имеет смысл. Например:

  public static void main (String[] args) {
      BufferedImage originalImage = [the original image with a specific file path];
      BufferedImage newImage = new BufferedImage(originalImage.getWidth() + 20 , originalImage.getHeight() + 20 , YOUR_IMAGE_TYPE);
      for (int i = 0 ; i < newImage.getHeight() ; i++){
          for (int j = 0 ; j < newImage.getWidth() ; j++){
               if (j > 20 && i > 20){
                     newImage.setRGB(i,j, originalImage.getRGB(i - 20, j - 20));
               } else{
                     newImage.setRGB(i,j, YOUR_RGB_VAL);
               }
          }
      }
    }

P.S. Я надеюсь, что код правильный. Я не проверял, а только написал на лету.

1 голос
/ 11 августа 2011

Это возможно, вам нужно исследовать BufferedImage и Graphic2D . Вы можете извлечь Graphic2D из BufferedImage, чтобы манипулировать изображением и рисовать его.

По сути, вы должны создать 2-е изображение большего размера и нарисовать первое в нем в правильном положении, чтобы оставить пустое пространство в 1-м.

...