2014-10-03 3 views
0

У меня возникла какая-то проблема. Когда я поворачиваю изображение, изображение обрезается по углам. Я использую следующий код для поворота изображения. Он вращается правильно, но становится срезанным во всех углах.Изображение разрезается по углам после поворота

public static Image rotate(BufferedImage img, double angle) { 
    int w = img.getWidth();  
    int h = img.getHeight();  
    BufferedImage result = new BufferedImage(w, h, img.getType()); 
    Graphics2D g2 = result.createGraphics(); 
    g2.setColor(Color.WHITE); 
    g2.fillRect(0, 0, w, h); 
    g2.rotate(Math.toRadians(angle), w/2, h/2); 
    g2.drawRenderedImage(img, null); 
    //g2.drawImage(img,null,0,0); 
    return result; 
} 

Мне нужно что-то, что не позволит разрезать углы. Пожалуйста помоги.

+0

Но что вы хотите? Ожидаете ли вы, что конечный «Image» будет иметь тот же размер, что и исходный (чтобы уменьшалось повернутое изображение), или вы ожидаете, что нарисованное изображение будет иметь (более или менее) начальный размер как начальный (так что экземпляр «Image» должен быть больше начального)? –

+0

Конечное изображение должно иметь тот же размер, что и исходный. Мое требование состоит в том, что изображение должно вращаться, но внешний вид должен быть одинаковым. Но в настоящее время изображение обрезается по углам. – harry

+0

Во-первых, внешний вид не имеет к этому никакого отношения. Во-вторых, если изображение занимает все пространство на компоненте, равном 20 на 40, и вы поворачиваете изображение на 90 градусов, изображение будет на 40 на 20, которое слишком велико по ширине, и это будет уменьшено. Вы должны либо перемасштабировать изображение, либо убедиться, что вы нарисовали его на достаточно большом компоненте. – user1803551

ответ

0

Как вы выяснили, изображение result слишком мало для повернутого экземпляра. Вы должны сделать некоторую математику, чтобы найти подходящий размер. Если вы слишком ленивы (= слишком умны), чтобы самостоятельно выполнить математику, создайте Rectangle2D, соответствующий вашему исходному изображению, создайте AffineTransform для вашего вращения, создайте преобразованную фигуру из вашего прямоугольника и используйте ограничительную рамку этой формы. (Вы можете применить то же преобразование к своему Graphics.)

+0

Я новичок в этом. Не могли бы вы помочь мне с какой-то ссылкой или фрагментом кода. Заранее спасибо – harry

+0

Я предполагаю, что вы понимаете * почему * ваш результат слишком мал. Пожалуйста, проверьте javadoc AffineTransform, как получить экземпляр, который представляет вашу ротацию, и как применить его к фигурам. Затем выполните следующие шаги. –

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