كيف يمكنني الحصول على بيانات صورة من QTKit بدون تصحيح اللون أو جاما في انعقاد الثلج؟

StackOverflow https://stackoverflow.com/questions/2052504

  •  20-09-2019
  •  | 
  •  

سؤال

منذ Snow Leopard ، تقوم QTKit الآن بإرجاع بيانات الصورة المصححة بالألوان من وظائف مثل QTmovies FrameImageAttime: withattributes: error:. بالنظر إلى ملف AVI غير مضغوط ، يتم عرض نفس بيانات الصورة مع قيم بكسل أكبر في Snow Leopard مقابل Leopard.

حاليًا أستخدم FrameImageAttime للحصول على nsimage ، ثم أطلب تمثيل هذه الصورة. بعد القيام بذلك ، تكون قيم البكسل أعلى قليلاً في الفهد الثلجي.

على سبيل المثال ، ملف ذو قيمة بكسل التالية في الفهد:

[0 180 0]

الآن لديه قيمة بكسل مثل:

[0 192 0]

هل هناك أي طريقة لطلب Qtmovie لإطارات الفيديو التي لم يتم تصحيح اللون؟ هل يجب أن أطلب cgimageref أو ciimage أو cvpixelbufferref بدلاً من ذلك؟ هل هناك طريقة لتعطيل تصحيح الألوان تمامًا قبل القراءة في ملفات الفيديو؟

لقد حاولت العمل حول هذه المسألة من خلال الاعتماد على nsbitmapimagerep مع nscalibratedcolrospace ، ولكن هذا يحصل فقط على الجزء الخاص بي هناك:

// Create a movie
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys :
                      nsFileName, QTMovieFileNameAttribute,
                      [NSNumber numberWithBool:NO], QTMovieOpenAsyncOKAttribute,
                      [NSNumber numberWithBool:NO], QTMovieLoopsAttribute,
                      [NSNumber numberWithBool:NO], QTMovieLoopsBackAndForthAttribute,
                      (id)nil];
_theMovie = [[QTMovie alloc] initWithAttributes:dict error:&error];


// ....    

NSMutableDictionary *imageAttributes = [NSMutableDictionary dictionary];
[imageAttributes setObject:QTMovieFrameImageTypeNSImage forKey:QTMovieFrameImageType];
[imageAttributes setObject:[NSArray arrayWithObject:@"NSBitmapImageRep"] forKey: QTMovieFrameImageRepresentationsType];
[imageAttributes setObject:[NSNumber numberWithBool:YES] forKey:QTMovieFrameImageHighQuality];

NSError* err = nil;
NSImage* image = (NSImage*)[_theMovie frameImageAtTime:frameTime withAttributes:imageAttributes error:&err];


// copy NSImage into an NSBitmapImageRep (Objective-C)
NSBitmapImageRep* bitmap = [[image representations] objectAtIndex:0]; 

// Draw into a colorspace we know about
NSBitmapImageRep *bitmapWhoseFormatIKnow = [[NSBitmapImageRep alloc] 
                                                initWithBitmapDataPlanes:NULL 
                                                pixelsWide:getWidth() 
                                                pixelsHigh:getHeight()
                                                bitsPerSample:8 
                                                samplesPerPixel:4 
                                                hasAlpha:YES 
                                                isPlanar:NO
                                                colorSpaceName:NSCalibratedRGBColorSpace 
                                                bitmapFormat:0
                                                bytesPerRow:(getWidth() * 4)
                                                bitsPerPixel:32];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:bitmapWhoseFormatIKnow]];
[bitmap draw];
[NSGraphicsContext restoreGraphicsState];

هذا يتم تحويله مرة أخرى إلى مساحة ألوان "غير مصححة" ، لكن قيم الألوان ليست تمامًا كما هو مخزّن في ملفات AVI غير المضغوطة التي نختبرها. كما أن هذا أقل كفاءة لأنه يتحول من RGB -> "الجهاز RGB" -> RGB.

أيضًا ، أنا أعمل في تطبيق 64 بت ، لذا فإن الانخفاض إلى API Quicktime-C ليس خيارًا.

شكرا لمساعدتك.

هل كانت مفيدة؟

المحلول

هذا ما تصطدم به: http://support.apple.com/kb/ht3712كما هو موضح هنا في إشارة إلى QT: http://developer.apple.com/library/mac/#technotes/tn227/_index.html

من المفترض أن يكون هناك علامة إلغاء الاشتراك في ColorSync (وهو تلقائي وصامت) ، ولكن لأن ColorSync يعود إلى "عصر الكربون" إذا كان هناك الكثير من الالتباس حول كيفية تعطيله من تطبيق 64 بت. قد يكون موجودًا ، وليس له أي وثائق. لكن حتى Adobe لم يحسب ذلك من Afaik (64 بت Photoshop لـ OS X ؟؟؟) [تحرير: في الواقع ، ربما فعلوا مع cs5 كن موردًا ؛) ومع ذلك ، أعتقد أن ألوانها قد تظهر مختلفة على 64 بت OS X مقابل Windows أو 32 بت].

يروي الرابط الأول كيفية إجبار قيمة Gamma على 1.8 على مستوى النظام وغير برمجة. ما عليك سوى الإشارة إليها - من المحتمل أن يكون ذلك محدودًا فقط لتطبيقك ، ولكن من الجيد معرفة ذلك.

الطريقة المعتادة لتعطيل ColorSync هي/كانت

GraphicsImportSetFlags( gi, kGraphicsImporterDontUseColorMatching ); 

لكنني لا أعرف ما إذا كان ذلك سيعمل في تطبيق 64 بت (متأكد من أنه لا). في الواقع ، فإن الكثير من الأشياء المتعلقة بـ ColorSync أكثر صعوبة ، وربما لم تكن ممكنة بعد ، في 64 بت. فقط ابحث "الموقع: Apple.com ColorSync 64 بت".

إذا وجدت شيئًا أفضل ، فسوف أقوم بتحرير إجابتي. فقط اعتقدت أن هذا سيساعدك على معرفة العدو ، إذا جاز التعبير.

تحرير آخر: (إعادة) قد تخفف العلامات على مقاطع الفيديو الخاصة بك أو تزيلها أيضًا ، لأن ColorNC تعامل مقاطع الفيديو غير المقيدة بطريقة معينة (انظر الروابط) وتعمل عليها بشكل مختلف حسب العلامات. ما هو ملونة مقاطع الفيديو؟ جرب SRGB ربما؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top