Я пытаюсь сохранить изображение в галерею 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
Хотелось бы получить помощь.
Лучший, Марек