خطأ في حفظ nsimage كـ NSData
-
22-09-2019 - |
سؤال
أنا أستخدم الكود التالي لحفظ إطار فيلم على سطح المكتب الخاص بي:
NSCIImageRep *imageRep = [NSCIImageRep imageRepWithCIImage:[CIImage imageWithCVImageBuffer:imageBuffer]];
NSImage *image = [[[NSImage alloc] initWithSize:[imageRep size]] autorelease];
[image addRepresentation:imageRep];
CVBufferRelease(imageBuffer);
NSArray *representations = [image representations];
NSData *bitmapData = [NSBitmapImageRep representationOfImageRepsInArray:representations usingType:NSJPEGFileType properties:nil];
[bitmapData writeToFile:@"/Users/ricky/Desktop/MyImage.jpeg" atomically:YES];
في السطر الأخير من التعليمات البرمجية ، أتلقى الرسائل التالية في وحدة التحكم ، دون أن يتم حفظها على سطح المكتب:
<Error>: CGImageDestinationFinalize image destination does not have enough images
CGImageDestinationFinalize failed for output type 'public.jpeg'
لا يزال Nsimage كائنًا مخصصًا لمكالمة الطريقة بأكملها ، لذلك لست متأكدًا من سبب تلقي شكاوى حول عدم كفاية عدد الصور.
سأقدر أي مساعدة. شكرا مقدما ، ريكي.
المحلول
أعتقد أن مصدر المشكلة هو أنك تمرر مجموعة من كائنات nsciimagerep إلى تمثيل imagerepsinarray: usepe: الخصائص: ، والتي أعتقد أن تتوقع مجموعة من كائنات nsbitmapimagerep.
ما تريد القيام به هو إنشاء nsbitmapimagerep من ciimage الخاص بك. ثم يمكنك استخدام ذلك للكتابة إلى القرص. سيكون ذلك تقريبًا:
CIImage *myImage = [CIImage imageWithCVImageBuffer:imageBuffer];
NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCIImage:myImage];
NSData *jpegData [bitmapRep representationUsingType:NSJPEGFileType properties:nil];
[jpegData writeToFile:@"/Users/ricky/Desktop/MyImage.jpeg" atomically:YES];
بالطبع ، تريد التعامل مع أي حالات خطأ وربما تمرير قاموس الخصائص لضبط إنشاء JPEG.
نصائح أخرى
أنا آسف لأنني لا أعرف حقًا لماذا لا يعمل الكود الخاص بك ، لكن الاقتراب منه بطريقة مختلفة (وأفكر بشكل أكثر كفاءة من cvimagebuffer إلى ciimage إلى nsciimagerep إلى nsimage إلى nsdata ، وإن كان ذلك على مستوى أقل قليلاً): -
ليس لدي رمز جاهز للقيام بذلك ولكن استخراج الأشياء الصحيحة من تلك الأمثلة يجب أن يكون مستقيمًا للأمام.