iOS UIImage альфа не распознается должным образом

Приведенный ниже код проходит через пиксели изображения и получает значение альфа каждого пикселя. Если альфа равна нулю, она создает красную точку в координате x, y. Ниже представлены 2 изображения с прозрачным фоном. Первый - это изображение буквы «C», и при рисовании красных точек происходит искажение. Второй - изображение буквы «D», и он отлично работает, причем красные точки помещаются точно там, где альфа равна нулю. Кто-нибудь знает, почему альфа одного изображения обнаруживается в искаженном шаблоне, а другое изображение обнаруживается совершенно нормально? Я действительно пытался понять это. Это не имеет никакого смысла для меня. Заранее благодарю за любой совет!!!

C has problems --> http://i45.tinypic.com/rtdyet.png

D works perfectly fine --> http://i45.tinypic.com/21mb3om.png

CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
UInt8 *pixels = (UInt8 *)CFDataGetBytePtr(data);

UIGraphicsBeginImageContext(size);
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 1);
CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), [UIColor redColor].CGColor);

for (int x = 0; x < size.width; x++)
{
    for (int y = 0; y < size.height; y++)
    {
        int index = ((x + (y * (int)size.width)) * 4) + 3;
        CGFloat alpha = pixels[index];
        if (alpha == 0)
        {
            CGContextBeginPath(UIGraphicsGetCurrentContext());
            CGContextMoveToPoint(UIGraphicsGetCurrentContext(), x, y);
            CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), x, y);
            CGContextStrokePath(UIGraphicsGetCurrentContext());
        }
    }
}

UIImage *test = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *testView = [[UIImageView alloc] initWithImage:test];
testView.frame = CGRectMake(0, 0, size.width, size.height);
[self.view addSubview:testView];
1
nl ja de
Ваш код предполагает 32-разрядные пиксели RGBA. Вы уверены, что это верно для каждого изображения?
добавлено автор rmaddy, источник
Откуда возникает переменная размера? Это из image.size?
добавлено автор rmaddy, источник
67968 равно 72x236x4. Перекошенное изображение, которое вы разместили, выглядит примерно так: около 6 пикселей на каждой строке. Вы принимаете 66x236 или вы действительно проверяете image.size?
добавлено автор rmaddy, источник
Все мои изображения создаются в приложении точно так же. Единственное различие - это буква, нарисованная на изображении. Некоторые изображения работают (D, J, O, E), но большинство других искажено.
добавлено автор primico, источник
Да, новое изображение, которое я создаю, такое же, как и тот, который я просматриваю пиксели. Когда я впервые начал тестировать, я не знал, что некоторые письма работают, поэтому я решил, что свойство ширины не установлено правильно, но как только я обнаружил, что другие изображения с разными буквами работают нормально, я как бы отклонил идею о том, что может быть проблема с размером. Но теперь, когда вы упомянули об этом, он все еще выглядит подозрительно, поскольку ширина не установлена ​​правильно. Я снова рассмотрю его.
добавлено автор primico, источник
Длина данных, похоже, не складывается должным образом. Если у меня размер изображения 66x236, я бы ожидал, что CFDataGetLength (данные) вернут 66x236x4 = 62304, однако он вернет 67968. Я думаю, что это моя проблема, но это не имеет никакого смысла.
добавлено автор primico, источник
Я просто шагнул через код с тремя различными изображениями (I, C, D) и получил точный размер изображения, длину данных и ожидаемую длину данных каждого из них:
добавлено автор primico, источник
I -> 66x236 -> 62304 -> 67968 C -> 126x236 -> 118944 -> 120832 D -> 128x236 -> 120832 -> 120832 Из этих 3 изображение D было единственной длиной, которая создавала ожидаемую длину (и отображалась правильно ) Я действительно думаю, что есть ошибка с CFDataGetLength.
добавлено автор primico, источник
Хорошо, я понял, что это ошибка. Я создавал UIImage с использованием UIGraphicsGetImageFromCurrentImageContext (), и это не сработало, однако, если я пишу одно и то же изображение в файл, например: [UIImagePNGRepresentation (UIGraphicsGetImageFromCurrentImage & zwnj; Context ()) writeToFile: путь атомарно: ДА] и использовать imageWithContentsOfFile , то он работает каждый раз. Спасибо за помощь rmaddy, вы подтолкнули меня в правильном направлении, как я могу отдать вам кредит за вашу помощь?
добавлено автор primico, источник
Хотя я и сделал это, чтобы работать последовательно, записывая изображения в файл, если кто-то знает другой способ получить пиксельные данные из образа, который будет работать последовательно, не записывая в файл, я был бы очень признателен. Это много лишней работы.
добавлено автор primico, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.