• inzel

    @cvp I get what you are asking. Sorry for the confusion...

    I have a script that uses the photos module to capture an image. I then use BytesIO to save the output as JPEG then base64 encoded so I can send it to an api. I want to figure out a way to make sure the resolution of the captured photo isnt above a certain size before I send it to the api to cut down on the filesize. I am hoping this will help with uploading the image on slower networks since it doesnt need to be that large. Since the photo is a PIL image when captured can I set it then or change it with the Images module? I have been trying to research this but am still not the greatest at code haha

    Hopefully that makes sense?

    Thanks again for the help,

    Colin

    posted in Pythonista read more
  • inzel

    Resizing would be fine as well actually. I was originally wondering if there is a way to set the size of the image when you save it but resizing afterwards would be fine too.

    Does that make sense?

    Thanks!

    posted in Pythonista read more
  • inzel

    Hello everyone,

    I am working with some facial recognition api’s and am wondering if there is a way for me to set a specific image size when using the photos module. I have been searching the docs and the forums but Im not having any luck.

    Any ideas?

    Thank you in advance,

    Colin

    posted in Pythonista read more
  • inzel

    I dont quite understand. Can you please explain the change to me?

    Edit: It does work making that change but I dont understand why its now needed. Thats what Im interested in learning about

    posted in Pythonista read more
  • inzel

    I tested itg on my phone and am getting the same results. No idea what changed here

    posted in Pythonista read more
  • inzel

    Hey JonB!

    Yes I have done that. Its really odd as this was working. Could it be because I went to the iPadOS beta?

    posted in Pythonista read more
  • inzel

    @Vincekok Thank you!

    posted in Pythonista read more
  • inzel

    I just came back to this project and I get an error!

    r = requests.post(url, data=json.dumps(values), headers = headers)

    Object of type 'bytes' is not JSON serializable

    I havent made any changes so I cant imagine why this is suddenly happening.

    Any thoughts?

    posted in Pythonista read more
  • inzel

    Is there a way to install Pythonista’s photo module in other Python environments? I cant find it with pip.

    Thanks,

    Inzel

    posted in Pythonista read more
  • inzel

    I decided to clean it up a bit and use some functions. I havent added my comments yet but here is a fully working solution:

    import photos
    import requests
    import io
    import base64
    import json
    
    img = photos.capture_image()
    
    def getPhoto():
        with io.BytesIO() as output:
            img.save(output, 'JPEG')
            contents = output.getvalue()
            image = base64.b64encode(contents)  
        return image
    
    def enrollPhoto():
        subject_id = raw_input("Hello, What is your name: ? ")
        print("Thank you " + subject_id + "." + " Analyzing...")
        image = getPhoto()
        url = "https://api.kairos.com/enroll"
        values = {
            'image': image,
            'subject_id': subject_id,
            'gallery_name': subject_id
        }
        headers = {
            'Content-Type': 'application/json',
            'app_id': '***********',
            'app_key': '****************************'
        }   
        r = requests.post(url, data=json.dumps(values), headers = headers)
        parsed_json = json.loads(r.content)
        attr = parsed_json['images'][0]['attributes']
        img.show()
        print(json.dumps(attr, indent=2))
    
    enrollPhoto()
    

    Just need to put in your actual app_id and app_key. Should work right away. My next step will be getting a simple interface built and then comparing the pic of the user to existing pics of the same user to determine whether or not they gain access. Something like that anyways. Turned out to be a fun endeavor!

    posted in Pythonista read more
  • inzel

    I got it to work!

    import photos
    import requests
    import io
    import base64
    import json
    
    with io.BytesIO() as output:
        img = photos.capture_image()
        img.save(output,'JPEG')
        contents = output.getvalue()
        image = base64.b64encode(contents)
        
    url = "https://api.kairos.com/enroll"
    
    values = {
        'image': image,
        'subject_id': 'test',
        'gallery_name': 'test'
    }
    
    headers = {
        'Content-Type': 'application/json',
        'app_id': '*********',
        'app_key': '*************************'
    }
    
    request = requests.post(url, data=json.dumps(values), headers=headers)
    response = request.content
    
    print(response)```
    
    Thanks everyone!

    posted in Pythonista read more
  • inzel

    @cvp

    Ah perfect. That part works now.

    with io.BytesIO() as output:
        img = photos.capture_image()
        img.save(output,'JPEG')
        contents = output.getvalue()
        image = base64.b64encode(contents)
    

    I feel we are very close. I believe the final step now is determining the proper syntax to POST the payload. This would be much easier if I was able to use wireshark or another packet capture tool to see how the POST looks as its being sent but I cant do that on my iPad. This is what I am trying for my payload line but the syntax is incorrect:

    payload = '{'"image": + image + "',"' + '\n' + '"subject_id": "test" + ","' + '\n' + '"gallery_name": "test"'}'
    

    I need it to look like this when its sent:

    {
    “image”: image,
    “subject_id”: “test”,
    “gallery_name”:”test”
    }

    My apologies for all the new guy questions. I really appreciate all the help you guys have provided me so far. Im learning...

    posted in Pythonista read more
  • inzel

    @cvp

    I tried that as well as:

    img.save(output, format = ‘JPG’)

    And I get errors each time:

    img.save(output, ‘JPG’) :

    Traceback (most recent call last):
    File "/private/var/mobile/Containers/Shared/AppGroup/2D8E43AB-E263-4AE8-9F57-E62CCC11779D/Pythonista3/Documents/Kairos/kairos_upload.py", line 9, in <module>
    img.save(output,'JPG')
    File "/var/containers/Bundle/Application/3C9A09E3-8A1E-49E7-956B-A8E46A817D5A/Pythonista3.app/Frameworks/Py2Kit.framework/pylib/site-packages/PIL/Image.py", line 1704, in save
    save_handler = SAVE[format.upper()]
    KeyError: 'JPG'

    img.save(output, format = ‘JPG’) :

    Traceback (most recent call last):
    File "/private/var/mobile/Containers/Shared/AppGroup/2D8E43AB-E263-4AE8-9F57-E62CCC11779D/Pythonista3/Documents/Kairos/kairos_upload.py", line 9, in <module>
    img.save(output, format = 'JPG')
    File "/var/containers/Bundle/Application/3C9A09E3-8A1E-49E7-956B-A8E46A817D5A/Pythonista3.app/Frameworks/Py2Kit.framework/pylib/site-packages/PIL/Image.py", line 1704, in save
    save_handler = SAVE[format.upper()]
    KeyError: 'JPG'

    Maybe my syntax is wrong?

    posted in Pythonista read more
  • inzel

    @cvp Thanks! I will look in to that as well

    posted in Pythonista read more
  • inzel

    @JonB

    I am trying to use bytesio and base64 but cant get past the img.save line:

    import photos
    import requests
    import io
    import base64
    
    #img = photos.capture_image()
    
    with io.BytesIO() as output:
        img = photos.capture_image()
        img.save(output)
        contents = output.getvalue()
        image = base64.b64encode(contents)
    
    url = "https://api.kairos.com/enroll```
    
    Error is:
    
    Traceback (most recent call last):
      File "/private/var/mobile/Containers/Shared/AppGroup/2D8E43AB-E263-4AE8-9F57-E62CCC11779D/Pythonista3/Documents/Kairos/kairos_upload.py", line 10, in <module>
        img.save(output)
      File "/var/containers/Bundle/Application/3C9A09E3-8A1E-49E7-956B-A8E46A817D5A/Pythonista3.app/Frameworks/Py2Kit.framework/pylib/site-packages/PIL/Image.py", line 1697, in save
        format = EXTENSION[ext]
    KeyError
    
    Appears that the save function requires me to have an extension. I then tried another angle and am getting a new error:
    
    

    img = photos.capture_image()
    contents = io.BytesIO(img)
    binary_data = contents.getvalue()
    image = base64.b64encode(binary_data)```

    Error is:

    Traceback (most recent call last):
    File "/private/var/mobile/Containers/Shared/AppGroup/2D8E43AB-E263-4AE8-9F57-E62CCC11779D/Pythonista3/Documents/Kairos/kairos_upload.py", line 8, in <module>
    contents = io.BytesIO(img)
    TypeError: 'Image' does not have the buffer interface

    posted in Pythonista read more
  • inzel

    @JonB

    Thanks for the info. I have tried both of those but will again and post my results.

    Thanks!

    posted in Pythonista read more
  • inzel

    @mikael

    The code is basically what I put in my original post. I have tried many many different things but havent been saving my code each time as I havent fully understood the modules. I guess I should just comment it all out in the future instead of deleting it. My main question is how I could take the image obtained from photos.capture_image() and then base64 encode it and send it in POST data.

    If you have any thoughts on that I would love to hear about it :) Or if you have any thoughts on another way of accomplising the same task that would be great as well.

    Thank you in advance!

    -inzel

    posted in Pythonista read more
  • inzel

    Those are all great ideas @reticulated!

    posted in General Discussion read more
  • inzel

    @mikael

    Here is the only real info I have from their docs:

    https://www.kairos.com/docs/api/

    POST /enroll

    Takes a photo, finds the faces within it, and stores the faces into a gallery you create.
    To enroll someone into a gallery, all you need to do is submit a JPG or PNG photo. You can submit the photo either as a publicly accessible URL, Base64 encoded photo or as a file upload.

    -inzel

    posted in Pythonista read more
  • inzel

    Thanks jonB

    Its interesting because I have tried that as well and am not having good results. Maybe I just dont understand how to use io well enough yet...

    posted in Pythonista read more
Internal error.

Oops! Looks like something went wrong!