مرشح تحويل الصورة الأساسية CIPerspective:كيفية استخدام سي فيكتورز؟

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

سؤال

أواجه صعوبة بالغة في العثور على أي وثائق عبر الإنترنت تشرح بوضوح كيفية تنفيذ مرشح CIPerspectiveTransform الخاص بـ Core Image بشكل صحيح.على وجه الخصوص، عند تعيين قيم CIVector لـ inputTopLeft, inputTopRight, inputBottomRight, ، و inputBottomLeft, ، ماذا تفعل هذه المتجهات بالصورة؟(على سبيل المثال، ما هي الرياضيات وراء كيفية تشويه هذه المتجهات لصورتي؟)

حاليا هذا هو الرمز الذي أستخدمه.لا يتعطل، لكنه لا يظهر صورة:

CIImage *myCIImage = [[CIImage alloc] initWithImage:self.image];
CIContext *context = [CIContext contextWithOptions:nil];
CIFilter *filter = [CIFilter filterWithName:@"CIPerspectiveTransform" keysAndValues:@"inputImage", myCIImage, @"inputTopLeft", [CIVector vectorWithX:118 Y:484], @"inputTopRight", [CIVector vectorWithX:646 Y:507], @"inputBottomRight", [CIVector vectorWithX:548 Y:140], @"inputBottomLeft", [CIVector vectorWithX:155 Y:153], nil];
CIImage *outputImage = [filter outputImage];
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *transformedImage = [UIImage imageWithCGImage:cgimg];
[self setImage:transformedImage];
CGImageRelease(cgimg);

أشياء أخرى يجب ملاحظتها والتي قد تكون مهمة:

  • تمت تهيئة UIImageView (75pts x 115 pts) بالفعل عبر WakeFromNib ولديه بالفعل صورة (151px x 235px) مرتبطة به.

  • يتم تنفيذ الكود أعلاه في ملف UIImageView's - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event وظيفة.الأمل هو أن أتمكن من ضبط منظور الصورة بناءً على إحداثيات الشاشة بحيث تبدو الصورة وكأنها تتحرك في مساحة ثلاثية الأبعاد.

  • هذا الكود مخصص لتطبيق iPhone.

مرة أخرى، السؤال الذي أعتقد أنني أطرحه هو ما الذي تفعله نواقل المعلمات المختلفة، ولكن ربما أطرح السؤال الخطأ.

المنشور التالي مشابه جدًا ولكنه يسأل عن سبب اختفاء صورته بدلاً من كيفية استخدام CIVectors لـ CIPerspectiveTransform.كما أنها لم تحظ باهتمام كبير، ربما لأنها عامة جدًا:كيف يمكنني استخدام مرشح CIPERspectiveTransform

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

المحلول

كما علقت على السؤال المرتبط، CIPerspectiveTransform هو غير متوفر في تطبيق iOS للصورة الأساسية اعتبارًا من iOS 5.1.ولهذا السبب لم تشاهد أنت والسائل الآخر أي صورة نتيجة لذلك، لأنه على الأرجح كان مرشح CIFilter الخاص بك صفراً.

إذا كنت تريد فقط تنفيذ شكل من أشكال المنظور على صورة ما، فهناك طريقتان سريعتان مختلفتان للقيام بذلك على نظام التشغيل iOS، كما أشرح في هذه الإجابة.الأول هو ببساطة استخدام النوع الصحيح من CATransform3D على طبقة UIImageView، ولكن هذا مفيد فقط للعرض، وليس لضبط الصورة.

الطريقة الثانية هي معالجة الصورة باستخدام مصفوفة تحويل ثلاثية الأبعاد مناسبة في OpenGL ES.كما أشير في الإجابة المرتبطة أعلاه، لقد فعلت إطار مفتوح المصدر الذي يغطي كل هذا، ونموذج FilterShowcase هناك يحتوي على مثال لتطبيق منظور على الفيديو الوارد.يمكنك بسهولة تبديل إدخال الفيديو بصورتك، والتقاط صورة منها بعد تطبيق تأثير المنظور.

نصائح أخرى

منشور Oooooold ولكن أراهن أن شخصًا ما سيظل يبحث عن هذا النوع من الفلتر:

تقوم الوظيفة التالية بتطبيق المرشح على الصورة وإرجاع نفس الصورة بمنظور يحاول إنشاء تأثير انعكاس بمنظور.(الصورة التالية مجرد مثال وليست نتيجة اختبار حقيقي)

Example of mirror effect

هذا مثال لذلك تحتاج إلى بعض التعديلات.والغرض من ذلك هو إنشاء صورة تبدو وكأنها انعكاس للصورة "الرئيسية".

لذلك أضفت عرضين للصورة إلى وجهة نظري كما في الصورة.القيود المضافة، الخ.

بعد ذلك، في func، ستلاحظ أن الإحداثيات تم ترميزها بشكل ثابت بحيث تتطابق الصورة المرتجعة تمامًا مع الحاوية الخاصة بها، وهي UIImageView السفلية.

enter image description here

func applyperspectiveTransform(imagen: UIImage) -> UIImage
{

      var context = CIContext()
    var outputImage = CIImage()
    var newUIImage = UIImage()

    let leftTop     = CGPoint(x: self.ImgView.frame.origin.x, y: self.ImgReflection.frame.origin.y + self.ImgReflection.frame.size.height)
    let leftBottom  = CGPoint(x: self.ImgReflection.frame.origin.x, y: self.ImgView.frame.origin.y + self.ImgView.frame.size.height)
    let rightTop    = CGPoint(x: self.ImgView.frame.origin.x + self.ImgView.frame.size.width, y: self.ImgReflection.frame.origin.y + self.ImgReflection.frame.size.height)
    let rightBottom = CGPoint(x: self.ImgReflection.frame.origin.x + self.ImgReflection.frame.size.width, y: self.ImgView.frame.origin.y + self.ImgView.frame.size.height)

    let lT = CIVector(x: leftTop.x, y: leftTop.y)
    let lB = CIVector(x: leftBottom.x, y: leftBottom.y)
    let rT = CIVector(x: rightTop.x, y: rightTop.y)
    let rB = CIVector(x: rightBottom.x, y: rightBottom.y)

    let aCIImage = CIImage(image: imagen)
    context = CIContext(options: nil);

    let perspectiveTransform = CIFilter(name: "CIPerspectiveTransform")!

    perspectiveTransform.setValue(lB,forKey: "inputTopLeft")
    perspectiveTransform.setValue(rB,forKey: "inputTopRight")
    perspectiveTransform.setValue(rT,forKey: "inputBottomRight")
    perspectiveTransform.setValue(lT,forKey: "inputBottomLeft")
    perspectiveTransform.setValue(aCIImage,forKey: kCIInputImageKey)

    outputImage = perspectiveTransform.outputImage!
    let cgimg = context.createCGImage(outputImage, from: outputImage.extent)
    newUIImage = UIImage(cgImage: cgimg!)

    return newUIImage
}

بالنسبة لهذا التأثير المحدد (المرآة)، قد ترغب في إضافة المزيد من التأثيرات، مثل التدرج، وتغيير ألفا، وما إلى ذلك

ترميز سعيد!نأمل أن يساعد

نأمل أن يساعد!

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