2013-07-30 3 views
0

У меня есть буферное изображение под названием bfi1, я хочу сохранить его в новом буферизованном изображении под названием bfi2. Но bfi2 не должен быть просто клоном, он должен содержать несколько строк и столбцов оригинала bfi1.Сохранение bufferedimage в строках и столбцах в новом Bufferedimage

Если у вас недостаточно ясности, задайте мне вопрос.

+0

Проверить это http://stackoverflow.com/questions/3514158/how-do-you-clone-a-bufferedimage – kaos

+0

Я 'не хочу просто скопировать его, мне нужно умножить его бок сбоку, вправо и вниз. В настоящее время я использую \t \t 'BufferedImage combo = new BufferedImage (ширина * 2, высота, BufferedImage.TYPE_INT_RGB); \t \t Графика g = combo.getGraphics(); \t \t g.drawImage (image, 0, 0, null); \t \t g.drawImage (изображение, ширина, 0, null); ' Я могу поместить это в forloop и некоторый интервал для каждого. Но это не очень эффективно. –

+0

Итак, окончательное изображение должно состоять из двух оригинальных изображений? – kaos

ответ

1

Вот пример кода, возможно, это поможет вам. Он занимает 500х500 снимков экрана рабочего стола, удваивает его и сохраняет в файле.

import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.image.BufferedImage; 
import java.awt.image.DataBufferInt; 
import java.awt.image.WritableRaster; 
import java.io.File; 

import javax.imageio.ImageIO; 



public class Test { 

private static final int WIDTH = 500; 
private static final int HEIGHT = 500; 
private static final int DOUBLE_HEIGHT = 1000; 

public static void main(String[] args) {     
    try { 
     Robot robot = new Robot(); 
     Rectangle captureSize = new Rectangle(0, 0, WIDTH, HEIGHT); 
     BufferedImage image = robot.createScreenCapture(captureSize); 

     int[] src = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); 
     int[] dst = new int[src.length * 2]; 
     System.arraycopy(src, 0, dst, 0, src.length); 
     System.arraycopy(src, 0, dst, src.length, src.length); 

     WritableRaster wr = image.copyData(null).createCompatibleWritableRaster(0, 0, HEIGHT, DOUBLE_HEIGHT); 

     for (int i = 0; i < wr.getNumBands(); i++) { 
      wr.setSamples(0, 0, HEIGHT, DOUBLE_HEIGHT, i, dst); 
     } 

     BufferedImage doubleImage = new BufferedImage(image.getColorModel(), wr, false, null); 

     ImageIO.write(doubleImage, "bmp", new File("D:/doubleImage.bmp")); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 
+0

Это было то, что я искал, но для базового и на самом деле более сложного, чем простой forloop. –

0

Это исправлено.

private void capImage(int rows, int cols,int mleft, int mtop, int mright, int mbot){ 
    glReadBuffer(GL_FRONT); 
    int width = (int)IMG.getWidth(); 
    int height = (int)IMG.getHeight(); 
    int ix = (int)IMG.getX(); 
    int iy = (int)SCREEN_HEIGHT - ((int)IMG.getY() + height); 
    int bpp = 4; 
    ByteBuffer buffer = BufferUtils.createByteBuffer(width * height * bpp); 
    glReadPixels(ix, iy, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 

    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 

    for(int x = 0; x < width; x++){ 
     for(int y = 0; y < height; y++){ 
      int i = (x + (width * y)) * bpp; 
      int r = buffer.get(i) & 0xFF; 
      int g = buffer.get(i + 1) & 0xFF; 
      int b = buffer.get(i + 2) & 0xFF; 
      image.setRGB(x, height - (y + 1), (0xFF << 24) | (r << 16) | (g << 8) | b); 
     } 
    } 

    BufferedImage combo = new BufferedImage(1350, 2650, BufferedImage.TYPE_INT_RGB); 
    Graphics g = combo.getGraphics(); 
    for(int r = 0; r < rows; r ++){ 
     for(int c = 0; c < cols; C++){ 
      if(c != 0&&r == 0){ 
       g.drawImage(image, mleft+(width * c) + (mright * c), mtop, null); 
      } 
      else if(c == 0&& r == 0){ 
       g.drawImage(image, mleft, mtop, null); 
      } 
      else if(c == 0&& r != 0){ 
       g.drawImage(image, mleft, mtop+(height * r) + (mbot * r), null); 
      } 
      else if (c != 0 && r != 0){ 
       g.drawImage(image, mleft + (width * c) + (mright * c), mtop +(height * r) + (mbot * r), null); 
      } 
     } 
    } 
    try { 
      ImageIO.write(combo, "png", file); 
     } catch (IOException e) { 
      e.printStackTrace(); 
    } 
Смежные вопросы