Nano Hash - криптовалюты, майнинг, программирование

Проблема с проверкой, что UIImage имеет альфа (прозрачный) цвет или нет

Я проверяю, есть ли у изображения прозрачная область (альфа) или нет. Я понял, что мне нужно изменить цвет UIImage

Я реализовал приведенный ниже метод, чтобы проверить, есть ли на изображении alpha или нет.

- (BOOL) checkAlpha  : (UIImage*) image
{
    for(int x = 0; x <  image.size.width ; x++)
    {
        for(int y = 0; y < image.size. height; y++)
        {
            CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
            const UInt8* data = CFDataGetBytePtr(pixelData);

            int pixelInfo = ((image.size.width  * y) + x ) * 4; // The image is png

            UInt8 red = data[pixelInfo];         // If you need this info, enable it
            UInt8 green = data[(pixelInfo + 1)]; // If you need this info, enable it
            UInt8 blue = data[pixelInfo + 2];    // If you need this info, enable it
            UInt8 alpha = data[pixelInfo + 3];     // I need only this info for my maze game
            CFRelease(pixelData);

            UIColor* color = [UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:alpha/255.0f];

            DLog(@"color : %@",color);
            DLog(@"alpha : %hhu",alpha)

            if (alpha)
                return YES;     // display original image from url.
            else
                return NO;      // apply brand color here.
        }
    }
    return YES;
}

Этот метод работает нормально, но для некоторых изображений он создает проблемы. См. Изображение ниже:

введите здесь описание изображения
Для альфа-изображения выше возврат 0;

введите здесь описание изображения  введите описание изображения здесь
И для двух вышеупомянутых изображений альфа имеет некоторое значение.

Все 3 изображения имеют одинаковый белый фон. Для первого изображения также должна быть некоторая альфа. это не должно быть 0. Пожалуйста, объясните мне это? есть ли в моем методе ошибка кода или что?


Ответы:


1

Перепишите ответ @ Hitarth в Swift4:

extension UIImage {
  public func isTransparent() -> Bool {
    guard let alpha: CGImageAlphaInfo = self.cgImage?.alphaInfo else { return false }
    return alpha == .first || alpha == .last || alpha == .premultipliedFirst || alpha == .premultipliedLast
  }
}
30.04.2018
  • Обычные изображения распознаются как прозрачные 13.07.2020

  • 2

    Наконец, найдите решение для текущих изображений, отображаемых в вопросе. Я хочу узнать, есть ли у UIImage альфа-канал или нет.

    - (BOOL)hasAlpha : (UIImage*) img
    {
        CGImageAlphaInfo alpha = CGImageGetAlphaInfo(img.CGImage);
        return (
                alpha == kCGImageAlphaFirst ||
                alpha == kCGImageAlphaLast ||
                alpha == kCGImageAlphaPremultipliedFirst ||
                alpha == kCGImageAlphaPremultipliedLast
                );
    
    }
    

    В этом случае hasAlpha метод работает нормально.

    Для получения дополнительной информации: Перейдите по этой ссылке

    01.09.2016

    3

    Как бы то ни было, я попытался загрузить ваши изображения, щелкнув правой кнопкой мыши и выбрав «получить информацию». В информации говорится, что у изображений нет альфа-канала, поэтому я бы начал с получения новых версий этих изображений, у которых есть альфа-канал.

    23.08.2016

    4

    Проведите по всем точкам на изображении \ слое и проверьте наличие альфа-канала следующим образом:

     UIColor *pixelColor = [SSAlphaPass colorOfPoint:point withLayer:self.layer];
        if(CGColorGetAlpha(pixelColor.CGColor))
        {
            return YES;
        }
    
        return NO;
    

    + (UIColor *) colorOfPoint:(CGPoint)point withLayer:(CALayer*)layer
    {
        unsigned char pixel[4] = {0};
    
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    
        CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast);
    
        CGContextTranslateCTM(context, -point.x, -point.y);
    
        [layer renderInContext:context];
    
        CGContextRelease(context);
        CGColorSpaceRelease(colorSpace);
    
        //NSLog(@"pixel: %d %d %d %d", pixel[0], pixel[1], pixel[2], pixel[3]);
    
        UIColor *color = [UIColor colorWithRed:pixel[0]/255.0 green:pixel[1]/255.0 blue:pixel[2]/255.0 alpha:pixel[3]/255.0];
    
        return color;
    }
    

    Я написал класс, который определяет, является ли определенный пиксель прозрачным. В этом случае UIButton, например, передает событие Touch в свой суперпредставление. Вы можете найти его полезным.

    24.08.2016

    5

    Во-первых, ваш вызов CGDataProviderCopyData () находится внутри цикла, поэтому он будет шокирующе медленным. Во-вторых, ваш код не будет работать с разными типами входных изображений PNG. Единственный способ заставить его работать должным образом - это визуализировать входное изображение в пиксельный буфер, а затем исследовать результат, когда он сведен в простые пиксели.

    17.08.2016
  • CGDataProviderCopyData () не создает никаких проблем в цикле постоянства. Основная проблема заключается в том, что все изображения имеют фон без какой-либо прозрачной области, тогда почему он возвращает альфа 0 только для первого изображения. не могли бы вы уточнить, как решить эту проблему. 18.08.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..