Last try
I have not been able to convert an Objective-C UIImage into a Pythonista ui.Image/PIL image, thus I did find this way through a lot of searches, not very nice but it functions and will allow you to test this "start camera - take photo - get image - display image" without using photos module, this perhaps could function on your iPhone 6 and, in this case, it could perhaps help @omz to debug the photos.capture which crashes on your device.
Anyway, I did learn a lot on objective-c, thus I didn't loose my time (I'm retired, thus I've a lot of free time) and I definitely love this app!
import ui
import console
import clipboard
from objc_util import *
import ctypes
from PIL import Image
def imagePickerController_didFinishPickingMediaWithInfo_(self,cmd,picker,info):
pick = ObjCInstance(picker)
# Set delegate to nil, and release its memory:
pick.setDelegate_(None)
ObjCInstance(self).release()
# Dismiss the sheet:
pick.dismissViewControllerAnimated_completion_(True, None)
# Get UIImage
infos = ObjCInstance(info)
print(infos)
img = infos['UIImagePickerControllerEditedImage'] # UIImage
# or
#img = infos['UIImagePickerControllerOriginalImage']
print(img)
print(img.ptr)
# I can't convert UIImage into ui.Image 🤕
# Save UIImage to jpg file
func = c.UIImageJPEGRepresentation
func.argtypes = [ctypes.c_void_p, ctypes.c_float]
func.restype = ctypes.c_void_p
x = ObjCInstance(func(img.ptr, 1.0))
x.writeToFile_atomically_('test.jpg', True)
# Display jpg file
image = Image.open("test.jpg")
image.show()
SUIViewController = ObjCClass('SUIViewController')
MyPickerDelegate = create_objc_class('MyPickerDelegate',
methods=[imagePickerController_didFinishPickingMediaWithInfo_], protocols=['UIImagePickerControllerDelegate'])
class Extracter(ui.View):
def __init__(self):
# Take Photo Button
self.take_photo = ui.Button(flex = 'LR', title = 'Take Photo')
self.take_photo.action = self.take_photo_action
self.add_subview(self.take_photo)
# Take Photo Action
#@ui.in_background
@on_main_thread
def take_photo_action(self, sender):
# Show camera
picker = ObjCClass('UIImagePickerController').alloc().init()
delegate = MyPickerDelegate.alloc().init()
picker.setDelegate_(delegate)
picker.allowsEditing = True
picker.sourceType = 1 # UIImagePickerControllerSourceTypeCamera
super_view = sender.superview
super_view_pntr = ObjCInstance(super_view)
vc = SUIViewController.viewControllerForView_(super_view_pntr)
vc.presentModalViewController_animated_(picker, True)
# Protect against import
if __name__ == '__main__':
view = Extracter()
view.present('sheet')