Как преобразовать (OS_dispatch_data *) 5018112 байт в NSData для помещения в UIImage

Я искал ответ на этот вопрос, и некоторые из них, похоже, могут быть тем, что мне нужно, но я не уверен. Я нашел этот вопрос № 9152851 и этот Вопрос № 2617625 и покопался в куче ссылок, но мне нужно какое-то направление здесь.

По сути, я отправляю асинхронный вызов для обработки изображения с помощью OpenCV. Вы можете видеть по коду здесь, что я превращаю его в NSData * перед отправкой обратно моему делегату.

NSData *proccessedData = [NSData dataWithBytes:processedImage.data length:(processedImage.rows * processedImage.cols)];        
[self.delegate onProcessedBitmapReady:proccessedData withFocusQuality:focusQuality];

Но когда я возвращаюсь к своему делегату, мой обрабатываемый битмап имеет тип (OS_dispatch_data *) и содержит значение в байтах. Итак, когда я пытаюсь установить UIImage, для него устанавливается значение null.

- (void)onProcessedBitmapReady:(NSData *)processedBitmap withFocusQuality:(double)focusQuality
{
    //Use comverted image from self.captureCommand onComplete
    UIImage *image = [[UIImage alloc] initWithData:processedBitmap];
    [self saveImage:image];
}

Вот скриншот со значениями:

Имгур

Итак, как мне преобразовать эти байты (или что-то еще) во что-то, что я могу вставить в UIImage?

Спасибо заранее за вашу помощь.

-------------------------------------------------- ----- Добавление нового изображения ---------------------------------- -------

Мои байты

Помогает ли этот новый образ?

Спасибо.


person Patricia    schedule 17.10.2013    source источник
comment
Сохраняет ли onProcessedBitmapReady объект NSData? Сохраняется ли объект NSData в другом месте? Вы используете АРК?   -  person Ramy Al Zuhouri    schedule 17.10.2013
comment
Для меня это похоже на исправленную память, ваши NSData не были сохранены должным образом.   -  person Leo Natan    schedule 17.10.2013
comment
Мой обрабатываемый битмап — это мой NSData. Я вижу в нем 5018112 байт. Странно только то, что он типа OS_dispatch_data *. Значит ли это, что память восстановлена?   -  person Patricia    schedule 17.10.2013
comment
В ПОРЯДКЕ. Я создал свойство с помощью (nonatomic, strong), и теперь я извлекаю это значение из своего объекта, и он по-прежнему говорит, что он имеет тип OS_dispatch_data *. Может ли это быть просто потому, что я вызываю его в асинхронном вызове с использованием GCD?   -  person Patricia    schedule 17.10.2013
comment
NSData, как и многие другие классы Foundation, на самом деле является кластером классов, а это означает, что NSData просто предоставляет интерфейс. OS_dispatch_data звучит как специализированный подкласс, который используется внутри Apple для передачи NSData данных по блокам, но я могу ошибаться. Если он ведет себя как экземпляр NSData, возможно, так оно и есть, а формат изображения не распознается UIImage.   -  person JustSid    schedule 18.10.2013
comment
@JustSid - Вы правы! Мне пришлось создать CGContextRef с помощью CGBitmapContextCreate, затем создать CGImageRef с помощью CGBitmapContextCreateImage, а затем создать UIImage с помощью imageWithCGImage. Ответь на вопрос и я дам тебе баллы.   -  person Patricia    schedule 18.10.2013
comment
@Lucy: Мог бы написать пост со своим ответом? о том, как вы обошли проблему?   -  person Shailesh    schedule 04.09.2014
comment
@Shailesh - я использовал код CVImageConverter Артема Мягкова, размещенный здесь: code.google.com/p/opencv-on-ios/source/browse/trunk/utilities/   -  person Patricia    schedule 11.09.2014


Ответы (1)


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

Кстати, у Apple есть отличное руководство по концепции кластеров классов, которое можно найти здесь.

person JustSid    schedule 17.10.2013
comment
В частности, OS_dispatch_data — это dispatch_data_t из libdispatch. В iOS 7 и Mavericks данные отправки могут быть свободно переданы в NSData и фактически являются подклассами NSData (конечно, если и только если Foundation связан в процессе). - person Catfish_Man; 18.10.2013