2015-07-14 6 views
0

У меня есть Буферизованное изображение и массив фигур, таких как кусочки головоломки. Я хочу вырезать эти фигуры из изображения. Я попробовал обрезать изображение, но он работает неправильно. То, что я сделал до сих пор:Режущие фигуры из изображения

for (int i = 0; i < rows; i++) { 
     for (int j = 0; j < cols; j++) { 
      Area area = areas[i][j]; 
      int width = (int) area.getBounds2D().getWidth(); 
      int height = (int) area.getBounds2D().getHeight(); 

      pieces[i][j] = new BufferedImage(width, height, image.getType()); 
      Graphics2D gr = pieces[i][j].createGraphics(); 
      gr.setClip(area); 
      gr.drawImage(image, 0, 0, null); 
      gr.dispose(); 

      try { 
       ImageIO.write(pieces[i][j], "png", new File("img/img" + i + "" + j + ".png")); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

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

+1

Вы проверили, что пересечение объектов Area с границами изображений не пусто? (то есть, формы над изображением, а не где-то еще или пустое) – lbalazscs

+0

Я думаю, что это поможет нам лучше понять вопрос, если вы покажете изображение, которое хотите клипнуть, и напечатайте пару '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' , Вы просто хотите извлечь суб-изображения, как думает @Glains, или вы действительно хотите скопировать одно изображение в несколько форм, как думает @lbalazscs? :-) – haraldK

+0

Это определенно необходимо, чтобы вы добавляли детали по крайней мере некоторых фигур к вопросу. Первая форма, которая преуспевает, и несколько из них, которые этого не делают. Включите данные, которые создают форму, а также какие 'i' и' j'. – RealSkeptic

ответ

3

На самом деле существует множество способов сделать это. Вот мой подход :)

int width = 0; 
int height = 0; 
int rows = 0; 
int columns = 0; 
BufferedImage sheet = // you image goes here 
BufferedImage[] pieces = new BufferedImage[rows * cols]; 
for (int i = 0; i < rows; i++) { 
    for (int j = 0; j < cols; j++) { 
     pieces[(i * cols) + j] = sheet.getSubimage(j * width, i * height, width, height);  
    } 
} 

Обратите внимание, что все фигуры находятся в одном массиве. Если вы все еще хотите, чтобы ваши части в двумерном массиве:

// Switch these lines 
BufferedImage[][] pieces = new BufferedImage[rows][cols]; 
pieces[i][j] = sheet.getSubimage(j * width, i * height, width, height); 

Дополнительная литература: Spritesheets и анимация
Нажмите here!

+0

Если вы хотите иметь динамические методы для вычисления ширины и высоты для 1 части, просто вызовите 'int width = sheet.getWidth()/colums;', но вы должны поместить объявление листа поверх вычисления, чтобы сделать эту работу. – Glains

+1

Мне кажется, что этот ответ пропускает точку OP, которая (насколько я понимаю) хочет вырезать непрямоугольные формы – lbalazscs

+0

Я понял что-то еще из текста вопроса, но мне жаль, если это не так точный ответ. Для более подробного мне нужен более четкий вопрос и, в конечном итоге, данный образ и предпочтительный результат. (кусочки головоломки обычно квадратные, поэтому это должно работать) – Glains