ios UIImageWriteToSavedPhotosAlbum - cra sh (приложение Qt) - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь сохранить изображение в галерею iOS из приложения Qt, я создал некоторый класс, который использует Objective- C с UIImageWriteToSavedPhotosAlbum, и он падает. Я предполагаю, что этот метод является асинхронным, и imageRef или imgResult недопустимы после завершения этой функции (я вижу «end» в отладке до cra sh). Я использовал эту тему: введите описание ссылки здесь

Вот мой класс:

#include "cl_image_call.h"
#include "cl_image_func.h"

myCLImageClass* CL_image_obj=NULL;
CGDataProviderRef provider=NULL;
CGColorSpaceRef colorSpace=NULL;
CGImageRef imageRef=NULL;
UIImage *imgResult=NULL;

int CL_ImageCCall::CL_objectiveC_Call() {
  //Objective C code calling..... 
    if( CL_image_obj==NULL ) {
      //Allocating the new object for the objective C class we created

        CL_image_obj=[[myCLImageClass alloc]init];

    }
  return 1;
}

bool CL_ImageCCall::saveImgToGallery(QImage *img) {
    if (img->isNull()) return nullptr;
    provider = CGDataProviderCreateWithData(nullptr, img->bits(), 2*img->sizeInBytes(), nullptr);
    colorSpace = img->isGrayscale() ? CGColorSpaceCreateDeviceGray() : CGColorSpaceCreateDeviceRGB();

    imageRef = CGImageCreate(
        img->width(),  img->height(),
        8, img->depth(), img->bytesPerLine(),
        colorSpace, CL_ImageCCall::getFlagsFromImageFormat(img->format()),
        provider, NULL, false, kCGRenderingIntentDefault);
    CGImageRetain(imageRef);

   // UIImage *imgResult = [UIImage imageWithCGImage:imageRef];

    imgResult = [[UIImage alloc] initWithCGImage:imageRef];

    qDebug()<<"img size:"<<img->size()<<" bytes:"<<img->sizeInBytes();

  //  UIImage* uiimg4Album = QImage2UIImmage(qimg4Album);
    if ( imgResult){
        UIImageWriteToSavedPhotosAlbum( imgResult, Nil, Nil, Nil);
       // CGImageRelease(imageRef);
       // CGDataProviderRelease(provider);
       // CGColorSpaceRelease(colorSpace);
        qDebug()<<"end";
        return true;
    }
   // CGImageRelease(imageRef);
   // CGDataProviderRelease(provider);
   // CGColorSpaceRelease(colorSpace);
    return false;
}

uint CL_ImageCCall::getFlagsFromImageFormat(QImage::Format frm)
{
    uint cgFlags = kCGImageAlphaNone;
    switch (frm) {
    case QImage::Format_ARGB32:
        cgFlags = kCGImageAlphaFirst | kCGBitmapByteOrder32Host;
        break;
    case QImage::Format_RGB32:
        cgFlags = kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Host;
        break;
    case QImage::Format_RGB888:
        cgFlags = kCGImageAlphaNone | kCGBitmapByteOrder32Big;
        break;
    case QImage::Format_RGBA8888_Premultiplied:
        cgFlags = kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big;
        break;
    case QImage::Format_RGBA8888:
        cgFlags = kCGImageAlphaLast | kCGBitmapByteOrder32Big;
        break;
    case QImage::Format_RGBX8888:
        cgFlags = kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Big;
        break;
    case QImage::Format_ARGB32_Premultiplied:
        cgFlags = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host;
        break;
    default:
        cgFlags = kCGImageAlphaNone;
    }
    return cgFlags;
}

Вот как я называю этот класс:

if( CL_ImageCCall::CL_objectiveC_Call() == 1 ){
        qDebug() << "PhotoModel::saveToGalleryIOS image init OK";
        return CL_ImageCCall::saveImgToGallery(&file_img);
    } else {
        qDebug() << "PhotoModel::saveToGalleryIOS image init failed";
        return false;
    }

Вот кра sh стек

#0      0x0000000236b11694 in ERROR_CGDataProvider_BufferIsNotReadable ()
#1      0x0000000236b110bc in CGDataProviderRetainBytePtr ()
#2      0x0000000236b4e22c in CGDataProviderCopyData ()
#3      0x0000000237327910 in IIOImagePixelDataProvider::getBytesDataProvider(void*, unsigned long) ()
#4      0x0000000237209c58 in AppleJPEGWritePlugin::writeOne(IIOImagePixelDataProvider*, IIODictionary*, IIODictionary*, unsigned int) ()
#5      0x000000023720a64c in IIO_Writer_AppleJPEG::write(void*, void*) ()
#6      0x00000002371f1724 in IIOImageDestination::finalize() ()
#7      0x000000024296a148 in imageDataFromImageWithFormatAndProperties ()
#8      0x000000024296a0b0 in imageDataFromImageRef ()
#9      0x0000000242910d50 in __65-[PLAssetsSaver _saveImage:imageData:properties:completionBlock:]_block_invoke ()
#10     0x00000002425d9890 in __79-[PLPrivacy _isPhotosAccessAllowedWithScope:forceHandler:accessAllowedHandler:]_block_invoke_2 ()
#11     0x00000002425c1080 in __pl_dispatch_async_block_invoke ()
#12     0x00000001043c76f4 in _dispatch_call_block_and_release ()
#13     0x00000001043c8c78 in _dispatch_client_callout ()
#14     0x00000001043d0bf4 in _dispatch_lane_serial_drain ()
#15     0x00000001043d18b4 in _dispatch_lane_invoke ()
#16     0x00000001043db77c in _dispatch_workloop_worker_thread ()
#17     0x0000000234afa114 in _pthread_wqthread ()
#18     0x0000000234afccd4 in start_wqthread ()
Enqueued from com.apple.mobileslideshow.accessIsolation (Thread 1) Queue : com.apple.mobileslideshow.accessIsolation (serial)
#0      0x00000001043cda1c in dispatch_async ()
#1      0x00000002425c1050 in pl_dispatch_async ()
#2      0x00000002425d957c in __79-[PLPrivacy _isPhotosAccessAllowedWithScope:forceHandler:accessAllowedHandler:]_block_invoke ()
#3      0x00000002425c0ffc in __pl_dispatch_sync_block_invoke ()
#4      0x00000001043c8c78 in _dispatch_client_callout ()
#5      0x00000001043d7480 in _dispatch_lane_barrier_sync_invoke_and_complete ()
#6      0x00000002425c0fcc in pl_dispatch_sync ()
#7      0x00000002425d945c in -[PLPrivacy _isPhotosAccessAllowedWithScope:forceHandler:accessAllowedHandler:] ()
#8      0x00000002429105a8 in -[PLAssetsSaver _saveImage:imageData:properties:completionBlock:] ()
#9      0x0000000242911828 in -[PLAssetsSaver saveImage:imageData:properties:completionTarget:completionSelector:contextInfo:] ()
#10     0x0000000247d2199c in PLSaveImageToCameraRoll ()
#11     0x0000000261074548 in UIImageWriteToSavedPhotosAlbum ()
#12     0x00000001005873f0 in CL_ImageCCall::saveImgToGallery(QImage*) at /cl_image_call.mm:37
#13     0x00000001004e03e8 in PhotoModel::saveToGalleryIOS(int, int, QString, QString) at /photo-model.cpp:265

Хотелось бы получить помощь.

Лучший, Марек

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...