2012-05-13 3 views
0

Хорошо, моя проблема проста, после выполнения AffineTransform мое изображение не сохраняется должным образом (однако оно нарисовано на JPanel правильно!). Это действительно странно, так что любые намеки действительно оценили ...Вращение по AffineTransform делает сохраненное изображение пустым

Посмотрите на код:

public BufferedImage performRotation(BufferedImage bi){ 

    if (angle!=180){ 
     at.translate(0.5*bi.getHeight(), 0.5*bi.getWidth()); 
     if(clockwise){ 
      at.rotate(Math.toRadians(angle)); 
     }else{ 
      at.rotate(Math.toRadians(-angle)); 
     }    
     at.translate(-0.5*bi.getWidth(), -0.5*bi.getHeight()); 
    } 
    else if(angle==180){ 
     at.translate(0.5*bi.getWidth(), 0.5*bi.getHeight()); 
     at.rotate(Math.toRadians(angle)); 
     at.translate(-0.5*bi.getWidth(), -0.5*bi.getHeight()); 
    } 

    AffineTransformOp op = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); 
    BufferedImage bi2 = op.filter(bi, null); 

    try {     
    ImageIO.write(bi, "bmp", new File("BEFORE filterORIG.bmp")); 
    ImageIO.write(bi2, "bmp", new File("AFTER filterNEW.bmp")); 
    } catch (IOException ex) { 
     Logger.getLogger(DrawingField.class.getName()).log(Level.SEVERE, null, ex); 
    } 

Файл ДО filterORIG сохраняется должным образом -> есть изображение, но его предварительно повернуты.

Файл AFTER ... сохраняется как пустой файл.

Что действительно интересно, ранее упомянутый факт, что это преобразование poperly, показанный на JPanel, что я использую в качестве дисплея (я могу наблюдать эффект желаемой трансформации)

Любая помощь приветствуется ...

+1

Я предполагаю, что это потому, что возврат не является результатом преобразования, а является «фильтрованной» версией (что бы это ни было). Я предполагаю что-то вроде 'new BufferedImage bi2(); op.filter (bi, bi2); 'это то, что вы хотите. Но я не знаю достаточно об этом, чтобы написать полный ответ. –

+0

YESS it worksss !! большое спасибо! Я боролся с этим с нескольких часов! Я очень благодарен! –

ответ

0

Попробуйте писать png изображения, то есть:

ImageIO.write(bi, "png", new File("BEFORE filterORIG.png")); 
ImageIO.write(bi2, "png", new File("AFTER filterNEW.png")); 

Полученное изображение (bi2) может иметь канал Aplha и ImageIO не может позволить, чтобы кодировать изображения с Aplha в bmp.

В качестве альтернативы, создайте целевое изображение с цветовой моделью TYPE_INT_RGB и используйте его в качестве второго аргумента в методе filter().

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