2016-11-09 3 views
2

Я попытался повернуть изображение на Java с помощью setRGB и BufferedImage, но я получаю странный результат. Кто-нибудь знает, почему?BufferedImage setRGB странный результат

BufferedImage pic1 = ImageIO.read(new File("Images/Input-1.bmp")); 
    int width = pic1.getWidth(null); 
    int height = pic1.getHeight(null); 

    double angle = Math.toRadians(90); 
    double sin = Math.sin(angle); 
    double cos = Math.cos(angle); 
    double x0 = 0.5 * (width - 1);  // point to rotate about 
    double y0 = 0.5 * (height - 1);  // center of image 

    BufferedImage pic2 = pic1; 

    // rotation 
    for (int x = 0; x < width; x++) { 
     for (int y = 0; y < height; y++) { 
      double a = x - x0; 
      double b = y - y0; 
      int xx = (int) (+a * cos - b * sin + x0); 
      int yy = (int) (+a * sin + b * cos + y0); 

      if (xx >= 0 && xx < width && yy >= 0 && yy < height) { 
       pic2.setRGB(x, y, pic1.getRGB(xx, yy)); 
      } 
     } 
    } 
    ImageIO.write(pic2, "bmp", new File("Images/Output2.bmp")); 

В стороны ЛЕВОЙ является исходным изображением, а в стороне RIGHT это мой результат. У кого-нибудь есть идеи, как я могу это исправить? enter image description here

Спасибо за помощь.

+1

Вы не можете повернуть изображение на свое место. Вы делаете другое отдельное повернутое изображение. Если вы собираетесь поворачивать изображение на 90 градусов, вам не нужно делать математику с вращением. Просто скопируйте координату x в новую координату y и координату y с новой координатой x. –

ответ

1

Проблема заключается в том, что вы используете один и тот же образ, как вход и выход:

BufferedImage pic2 = pic1;

Вы должны создать другое изображение для pic2, а затем выполнить поворот, копируя пиксели с Image1 на Image2.

Обратите внимание, что с использованием getRGB и setRGB это ужасно медленно. Он в 100 раз быстрее, если вы напрямую управляете пикселями.

+0

Спасибо, я не заметил эту ошибку: D теперь это работает. и о setRBG и getRGB ... Я знаю, что они так медленны .... но я не знаю, как преобразовать изображение во что-то вроде пикселей [] []. Я ищу все в Интернете, и все, что я вижу, это то, как получить массив 1D из изображения, я имею в виду что-то вроде пикселей []. Но мне нужен 2D-массив, как пиксели [] [], и я понятия не имел, как его получить ... Можете ли вы мне помочь и с этим, пожалуйста? : D –

+0

В этом случае вы создаете изображение с пикселями: http://stackoverflow.com/questions/8856569/how-to-get-the-array-of-pixel-values-for-an-image-in -java-getrgb-используя –

Смежные вопросы