Java BufferedImage padding - PullRequest
       41

Java BufferedImage padding

3 голосов
/ 20 июля 2010

Есть ли более быстрый способ добиться заполнения пикселов для BufferedImage, чем отрисовка его по центру большего BufferedImage?

Ответы [ 3 ]

2 голосов
/ 20 июля 2010

Создайте ImageIcon с помощью BufferedImage и добавьте Icon в JLabel. Затем вы можете просто добавить границу к метке, чтобы получить желаемый отступ.

2 голосов
/ 20 июля 2010

BufferedImage имеет конструктор, в котором вы можете указать WriteableRaster.

Выбирая буферизованное изображение по умолчанию, сохраняя каждый пиксель в int, он использует IntegerInterleavedRaster.

ColorModel выможно использовать ColorModel.getRGBDefault ().

int imageWidth = 638, imageHeight = 480;
int dataImageWidth = 640;

SampleModel sm = new SinglePixelPackedSampleModel(TYPE_INT, imageWidth, imageHeight, dataImageWidth, new int[] { 0xff0000, 0xff00, 0xff });
DataBuffer db = new DataBufferInt(dataImageWidth * imageHeight);
WritableRaster r = Raster.createWritableRaster(sm, db, new Point());
BufferedImage image = new BufferedImage(ColorModel.getRGBDefault(), r, false, null);

Обратите внимание на scanlineStride в SinglePixelPackedSampleModel (второй последний параметр).

Еще один гораздо более простой подход заключается в использовании метода BufferedImage getSubimage.

BufferedImage fullImage = new BufferedImage(dataImageWidth, imageHeight);
BufferedImage subImage = fullImage.getSubimage(0, 0, imageWidth, imageHeight);
1 голос
/ 20 июля 2010

Чтобы отложить центрирование до рендеринга, мне нравится подход из-за finnw , где this - подходящий компонент:

private BufferedImage image;
....
@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.translate(this.getWidth() / 2, this.getHeight() / 2);
    g2d.translate(-image.getWidth() / 2, -image.getHeight() / 2);
    g2d.drawImage(image, 0, 0, null);
}
...