Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello β I'm @olemoritz on Twitter.
Clipboard.get_image Crash in Pythonista Keyboard
-
ive heard iPhoneX has had alot of issues since launch with multiple apps.. never looked into this though.
aside from that i did a little research and your phone has:
Liquid Retina HD display 6.1-inch (diagonal) all-screen LCD Multi-Touch display with IPS technology 1792-by-828-pixel resolution at 326 ppi 1400:1 contrast ratio (typical) True Tone display Wide color display (P3) Haptic Touch 625 nits max brightness (typical) Fingerprint-resistant oleophobic coating Support for display of multiple languages and characters simultaneously A12 Bionic chip Second-generation Neural Engine
my iPhone 6s has
IPS LCD capacitive touchscreen, 16M colors Size 4.7 inches, 60.9 cm2 (~65.6% screen-to-body ratio) Resolution 750 x 1334 pixels, 16:9 ratio (~326 ppi density) Protection Ion-strengthened glass, oleophobic coating 3D Touch PLATFORM OS iOS 9, upgradable to iOS 13.4 PowerVR GT7600 (six-core graphics)
So our devices are very close only reasonable diference would be screen size(not resolution) and CPU Generation.
that said following is my test with same code on my iPhone 6s.
Phone actually performed much faster than my iPad air2
im not sure what is creating this issue on your end .. could i posibly get a image you are using and the code? ad what format is the image ur trying to display? are cinverting the image from PIL (what
clipboard.get_image()
produces) to abmp
,png
,jpeg
ortiff
? (only formats i have used myself..)
i really want to help get you back on track. ππ€ -
@stephen You are really nice,so much thanks.you can try this picture,
Just took with my phone. -
@mieq your picture of 720kb crash my iPad mini 4 and one picture of 600 kB works...
-
@cvp Me,tooπ
-
not sure if good or bad news ππ
turns out.. your devices, and im assuming its same case for @cvp , are using the P3 xyz colorspace.. this is awesome for image clearity and especially for illumination.. but apparently the pykeys keyboard doesnt support. its Apple mode and has a wider color range especially twards yellow band. but im assuming this is do to tbe limited memory givin by ios and ipad os.. i tried converting to
tiff
,jpeg
(original format),png
andbmp
. i tried making aBytesIO
object and i tried resizing. i even tried using UIimage and CGColor from Objc_utils. i ttied to find a solution that wouldnt make user change settings on their device but it seems you will need to change color fromDisplay P3
tosRGB
,RGBa
orrgb
at the least.here is a great resource for conversions. folowing is img showing the Display P3 having been set.
*if anyone finds a way around this or finds my resault false please let me know its going to bug me till i fix it lol
-
@stephen
oh, Thanks for all of this.I was really surprised that you were able to explore such a deep field.and it really help me a lot,Thanks. -
@mieq not a problem. i usually wonder around the game development realm so images feel very familier.. i hope changing color format on ur device helps.
-
@mieq with Objectivec, no crash π with an image of 6MB πΎ
import keyboard import ui from objc_util import * if __name__ == '__main__': v = ui.ImageView() UIPasteboard = ObjCClass('UIPasteboard').generalPasteboard() im = UIPasteboard.image() ObjCInstance(v).setImage_(im) if keyboard.is_keyboard(): keyboard.set_view(v) else: v.present('sheet')
-
@cvp wow, works perfectly.thank you! Actually, last night I was thinking whether Objectivec can be used to replace the function of cliboard.get_image. But it was too hard for me to do that.π
Do you mind if I ask a few more questions about Objectivec? when I get the object of UIPasteboard.image(), how can I change it to a python object (like PIL image or binary data)? and can UIPasteboard.image() handle with gif files? so much Thanks!
-
@mieq said:
how can I change it to a python object
I think you can't but, often, tou can access to Objectivec object of a Python(ista) object by its ObjInstance.
-
@mieq said:
can UIPasteboard.image() handle with gif files?
Yes, you can paste a gif but up to you to display it as gif
-
Pasteboard should produce a byted object i belive and using a context manager probably with BytesIO then u can convert that to ui.image with from_data. make sure you pass a 2.0 for second param to acount for your 2:1 retina.
@cvp outstanding!
i was so stuck on the image i didnt even think of UIPasteBoard good lookin out!
-
-
heres how i would of π€
import keyboard import ui import io from objc_util import * if __name__ == '__main__': v = ui.ImageView() UIPasteboard = ObjCClass('UIPasteboard').generalPasteboard() img_from_pasteboard = UIPasteboard.image() png_raw_bytes=uiimage_to_png(img_from_pasteboard) with io.BytesIO(png_raw_bytes) as bIO: new_ui_img = ui.Image.from_data(bIO.getvalue(), 2) v.image = new_ui_img if keyboard.is_keyboard(): keyboard.set_view(v) else: v.present('sheet')
-
@stephen did you try with a gif, is it animated? I had read that with PasteBoard image, we get only the first frame of the gif, reason why I tried to get the entire file as data. And with my 3 lines, I get data with the length of the entire file.
-
-
-
@stephen Your
UIPasteboard = ObjCClass('UIPasteboard').generalPasteboard() img_from_pasteboard = UIPasteboard.image() png_raw_bytes=uiimage_to_png(img_from_pasteboard) with io.BytesIO(png_raw_bytes) as bIO: new_ui_img = ui.Image.from_data(bIO.getvalue(), 2) v.image = new_ui_img
or mine
UIPasteboard = ObjCClass('UIPasteboard').generalPasteboard() im = UIPasteboard.image() ObjCInstance(v).setImage_(im)
-
@cvp yours is beter not only cleaner but it is ALOT faster too. plus as u said the python ui.image only gets first frame π€π great job !
-
@mieq and @stephen this works for gif πΎ
import keyboard import ui import io from objc_util import * from PIL import Image class Gif(ui.View): def __init__(self,pil,duration): self.duration = duration self.ImageView = ui.ImageView() self.add_subview(self.ImageView) self.pil = pil self.update_interval = self.duration / self.pil.n_frames self.frame_id = 0 def pil2ui(self,imgIn): with io.BytesIO() as bIO: imgIn.save(bIO, 'PNG') imgOut = ui.Image.from_data(bIO.getvalue()) del bIO return imgOut def update(self): # Display individual frames from the loaded animated GIF file self.pil.seek(self.frame_id) self.ImageView.image = self.pil2ui(self.pil) self.frame_id = self.frame_id + 1 if self.frame_id >= self.pil.n_frames: self.frame_id = 0 def touch_ended(self,touch):j if self.update_interval == 0: self.update_interval = self.duration / self.pil.n_frames else: self.update_interval = 0 if __name__ == '__main__': UIPasteboard = ObjCClass('UIPasteboard').generalPasteboard() data = UIPasteboard.dataForPasteboardType_("com.compuserve.gif") b = nsdata_to_bytes(ObjCInstance(data)) pil = Image.open(io.BytesIO(b)) v = Gif(pil,1) v.present('sheet')#,hide_title_bar=True)