Clipboard.get_image Crash in Pythonista Keyboard
It seems Clipboard.get_image Can’t handle a large image (900kb in my case) in Pythonista Keyboard. Is there any workarounds？Thanks.
@cvp my first was probably small. i ran couple more and as i expected, 8k image (7680 × 4320) unknown filesize.. was too large for either PIL or ui. i have had this problem before.
with 4k (3840 x 2160) fileize 2.5MB. i know worked in PIL and ui, i usually deal with 4000x4000 up to 6000, 6000 for my game assets.
if there is an issue on your side with image being too large i would sugest using
ANTI_ALIASto resize image while maintaining quality. i have noticed that combining this method with
scenepower of rescaling you get really impressive quality after resizing.
of course my scaling example wouldnt work in keyboard.. 6kx6k=88MB but i hope it helps in getting your image to display
def ConvertPIL(): with io.BytesIO() as bIO: with Image.open('6k png test.png') as img: console.show_image('6k png test.png') resized = img.resize((2000, 2000), 1) # 1 == Anti-Alias resized.show() resized.save(bIO, 'png') resized.close() return ui.Image.from_data(bIO.getvalue(), 2) # 2 == scaling for retina can be 3 on newer models or 1 for no retina scaling bIO.close()
im using iPad Air2 (i believe this is same as iPad 5) with Retina screen (2x scale)
im sure we have checked but has your device givin full acsess to pykeys?
I had full acsess to pykeys,Crash anyway.works
when Copying pictures below 500 kb.Running on my iPhone XR.Does this mean that different devices are different?
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 a
tiff? (only formats i have used myself..)
i really want to help get you back on track. 🙃🤓
@mieq your picture of 720kb crash my iPad mini 4 and one picture of 600 kB works...
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
bmp. i tried making a
BytesIOobject 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 from
rgbat 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
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!
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.
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.
i was so stuck on the image i didnt even think of UIPasteBoard good lookin out!
Pasteboard should produce a byted object i belive
@mieq first step
UIPasteboard = ObjCClass('UIPasteboard').generalPasteboard() data = UIPasteboard.dataForPasteboardType_("com.compuserve.gif") print(data)
Next step: data -> pil then use my gif script here
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.