Разрезание UIImage на iPhone

Я нашел ответ. Мне нужно вместо этого установить {readableObjectMode: true}, потому что это фактически читаемая сторона моего потока преобразования, которую я использую, а не доступная для записи.

13
задан Chris Hanson 21 November 2008 в 10:31
поделиться

2 ответа

Еще после некоторого экспериментирования я нашел следующее решение (я все еще не знаю, почему оно не работало, как первоначально записано, все же.), Но так или иначе, режущие работы после того, как изменить размер код помещается на месте, даже когда изменение размеров является ненужным:

if(newDim != 320.0){
            CGSize finalSize = CGSizeMake(320.0, 320.0);
            UIGraphicsBeginImageContext(finalSize);
            [squareImage drawInRect:CGRectMake(0, 0, finalSize.width, finalSize.height)];
            playImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
}else{
            CGSize finalSize = CGSizeMake(320.0, 320.0);
            UIGraphicsBeginImageContext(finalSize);
            [squareImage drawInRect:CGRectMake(0, 0, finalSize.width, finalSize.height)];
            playImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
}

У кого-либо есть какая-либо подсказка, ПОЧЕМУ это продолжается?

P.S. Да, если/еще больше не требуется здесь. При удалении его, прежде чем я знал, он собирался работать, будет глупо, все же.

5
ответ дан 2 December 2019 в 01:57
поделиться

Просто из любопытства, почему вы сделали свой изменяемый массив с ограничением 0, когда вы знаете, что собираетесь поместить в него 16 элементов?

Ну, Помимо этого, я пробовал основные методы, которые вы использовали для изменения размера и нарезки (мне не нужно было обрезать, потому что я работаю с изображениями, которые уже квадратные), и я не могу воспроизвести вашу проблему в симуляторе. Вы можете попробовать разбить свой код на три отдельные функции (обрезать до квадрата, изменить размер и разрезать на части), а затем протестировать три по отдельности, чтобы понять, какой из трех шагов вызывает проблемы (например, входные изображения, которые вы выполняли манипуляции в обычной графической программе вместо использования цели c, а затем проверяли, что вы получаете обратно!).

Я прикреплю свои версии функций изменения размера и фрагмента ниже, которые, надеюсь, будут полезны. Было приятно ознакомиться с вашими версиями, так как мне не пришлось искать все методы самому на один раз. :)

В качестве примечания, упомянутый двумерный массив - это мой собственный класс, построенный на основе NSMutableArrays, но вы можете легко реализовать свою собственную версию или вместо этого использовать плоский NSMutableArray. ;)

// cut the given image into a grid of equally sized smaller images
// this assumes that the image can be equally divided in the requested increments
// the images will be stored in the return array in [row][column] order
+ (TwoDimensionalArray *) chopImageIntoGrid : (UIImage *) originalImage : (int) numberOfRows : (int) numberOfColumns
{   
// figure out the size of our tiles
int tileWidth = originalImage.size.width / numberOfColumns;
int tileHeight = originalImage.size.height / numberOfRows;

// create our return array
TwoDimensionalArray * toReturn = [[TwoDimensionalArray alloc] initWithBounds : numberOfRows 
                                                                             : numberOfColumns];

// get a CGI image version of our image
CGImageRef cgVersionOfOriginal = [originalImage CGImage];

// loop to chop up each row
for(int row = 0; row < numberOfRows ; row++){
    // loop to chop up each individual piece by column
    for (int column = 0; column < numberOfColumns; column++)
    {
        CGImageRef tempImage = 
                CGImageCreateWithImageInRect(cgVersionOfOriginal, 
                                             CGRectMake(column * tileWidth, 
                                                        row * tileHeight, 
                                                        tileWidth, 
                                                        tileHeight));
        [toReturn setObjectAt : row : column : [UIImage imageWithCGImage:tempImage]];
    }
}

// now return the set of images we created
return [toReturn autorelease];
}

// this method resizes an image to the requested dimentions
// be a bit careful when using this method, since the resize will not respect
// the proportions of the image
+ (UIImage *) resize : (UIImage *) originalImage : (int) newWidth : (int) newHeight
{   
// translate the image to the new size
CGSize newSize = CGSizeMake(newWidth, newHeight); // the new size we want the image to be
UIGraphicsBeginImageContext(newSize); // downside: this can't go on a background thread, I'm told
[originalImage drawInRect : CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); // get our new image
UIGraphicsEndImageContext();

// return our brand new image
return newImage;
}

Ева Шиффер

1
ответ дан 2 December 2019 в 01:57
поделиться