Повернуть UIImage на произвольный градус

Я использую следующий код для достижения этой цели. Проблема в том, что когда изображение поворачивается, оно масштабирует изображение ближе к 45'.

Когда для изображения установлено значение 90 футов и его кратное число, проблем с размером изображения нет. Но когда градус приближается к 45' и кратным ему значениям, происходит заметное уменьшение размера изображения. Я не хочу менять размер изображения. Как мне подойти к этой проблеме?

- (UIImage *)imageRotatedByRadians:(CGFloat)radians img:(UIImage *)img
{
    // calculate the size of the rotated view's containing box for our drawing space
    UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,img.size.width, img.size.height)];
    UIView *nonrotatedViewBox = rotatedViewBox;
    CGAffineTransform t = CGAffineTransformMakeRotation(radians);
    rotatedViewBox.transform = t;
    CGSize rotatedSize = rotatedViewBox.frame.size;

    // Create the bitmap context
    UIGraphicsBeginImageContext(nonrotatedViewBox.frame.size);
    CGContextRef bitmap = UIGraphicsGetCurrentContext();

    // Move the origin to the middle of the image so we will rotate and scale around the center.
    CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);

    //Rotate the image context
    CGContextRotateCTM(bitmap, radians);

    // Now, draw the rotated/scaled image into the context
    CGContextScaleCTM(bitmap, 1.0, -1.0);
    CGContextDrawImage(bitmap, CGRectMake(-img.size.width / 2, -img.size.height / 2, img.size.width, img.size.height), [img CGImage]);

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

person Esqarrouth    schedule 13.05.2014    source источник
comment
Вам нужно повернуть изображение или вы можете повернуть UIImageView, и это решит вашу проблему. Кроме того... размеры вашего представления неверны, вы не хотите рисовать изображение по ширине и высоте, деленной на 2. Потому что, когда изображение поворачивается, его ширина становится (при обращении к идеальному квадрату) шириной раз 2 раза sqr(2). поэтому, если бы у вас была ширина и высота, равная 10, ваша новая ширина (под углом 45 градусов) была бы между 14 и 15... поэтому ваш контекст рисует изображение 14x14 в области 10x10.   -  person A'sa Dickens    schedule 13.05.2014
comment
вы могли бы выполнить некоторые сложные математические действия, чтобы получить идеальные размеры, используя геометрию, или вы могли бы подпрыгнуть и сказать | двойной процент Rotated = (радианы % M_PI_4)/M_PI_4; double newWidth = (percentRotated == 0 ? img.size.width : img.size.width * (1 + процентповорота) ); и сделать то же самое для высоты   -  person A'sa Dickens    schedule 13.05.2014
comment
Мне нужно повернуть изображение, потому что я собираюсь его сохранить. Мое изображение представляет собой идеальный квадрат, я попробую изменить ширину.   -  person Esqarrouth    schedule 13.05.2014
comment
это трудно объяснить с помощью текста, поэтому из-за этого теста возьмите изображение 100x100, в своем коде не поворачивайте его и установите границы 100x100, затем поверните его на 45 градусов или PI / 4 радиана, а затем перейдите в 141x141 для ширину/высоту и посмотрите, выглядит ли это правильно, оттуда вы, вероятно, увидите, о чем я говорю: 3   -  person A'sa Dickens    schedule 13.05.2014
comment
CGFloat newsize = sqrtf((img.size.width * img.size.width)*2); ---- CGContextDrawImage(bitmap, CGRectMake(-img.size.width / 2, -img.size.height / 2, новый размер, новый размер), [img CGImage]); ------ Я сделал это, теперь размер изображения правильный. Проблема в том, что изображение теперь наклонено вправо, обрезая часть изображения. Любые идеи с этим?   -  person Esqarrouth    schedule 13.05.2014
comment
Я ясно или мне нужно разместить изображения?   -  person Esqarrouth    schedule 13.05.2014
comment
nvm решил это с помощью CGContextDrawImage(bitmap, CGRectMake(-newsize/2, -newsize/2, newsize, newsize), [img CGImage]); вы можете сделать ответ официальным   -  person Esqarrouth    schedule 13.05.2014
comment
о, хорошо, я сделаю официальный ответ   -  person A'sa Dickens    schedule 13.05.2014


Ответы (1)


размеры вашего представления неверны, вы не хотите рисовать изображение по ширине и высоте, деленной на 2. Потому что, когда изображение поворачивается, его ширина становится (при обращении к идеальному квадрату) шириной, умноженной на 2 раза sqr (2). поэтому, если бы у вас была ширина и высота, равная 10, ваша новая ширина (под углом 45 градусов) была бы между 14 и 15... поэтому ваш контекст рисует изображение 14x14 в области 10x10.

вы могли бы выполнить некоторые сложные математические действия, чтобы получить идеальные размеры, используя геометрию, или вы могли бы подпрыгнуть и сказать | двойной процент Rotated = (радианы % M_PI_4)/M_PI_4; double newWidth = (percentRotated == 0 ? img.size.width : img.size.width * (1 + (percentRotated % 0,25)) ); и проделайте то же самое с высотой, #ленивыйпрограммист

person A'sa Dickens    schedule 13.05.2014
comment
хотя, глядя на мой ответ, МАКСИМАЛЬНЫЕ размеры будут восприниматься только при 45%, так что (1 + процентный поворот) испортит его XD, поэтому он должен выполнить процентный поворот% 25, ​​что означает, что это с шагом максимального расстояния π / 4 - person A'sa Dickens; 10.11.2014