reuterbal / photobooth

A flexible photobooth software
GNU Affero General Public License v3.0
317 stars 158 forks source link

[Success story] Wedding Photobox for my brother #148

Open websta911 opened 5 years ago

websta911 commented 5 years ago

Describe your photobooth

Thank you very much for providing the code for this photobooth it really helped me a lot. Initially I built it for my brothers wedding with the previous first version of your photobox and upgraded to the new version and added some features for some birthdayparties and weddings in the last year. I made it out of plywood and engraved some birds around the camera hole (as an inside joke). Because of an older camera(no Live view) available I used the raspicam as preview camera and shot with the old canon but since then upgraded to the Canon 550D (with liveview), thats the little black hole in the front, I plan on closing that Unfortunately I always forget to take a picture when this thing is in action so there are just shots during maintenance or upgrades. When in use it sits on 4 legs also made from Plywood.

With every use of it I try finessing some things around that. I am planning on uploading the pictureBrowser to github, if someone likes that and wants to use it but I just made the account so please be patient.

Hardware :

Software:

Modifications:

Problems:

Pictures: IMG_20181020_153343 IMG_20181020_153323 IMG-20180518-WA0004 IMG-20180518-WA0002

picturelibrary settingsPicture

thyristor59 commented 5 years ago

Awesome box and the birds are very beautiful!

I am amazed by the multiple choice of image layouts! would you have a plan to follow to achieve the same thing at home?

I am too bad to do it alone. but I progress in the python thanks to this photobooth! in advance thank you so it does not bother you!

websta911 commented 5 years ago

Awesome box and the birds are very beautiful!

I am amazed by the multiple choice of image layouts! would you have a plan to follow to achieve the same thing at home?

I am too bad to do it alone. but I progress in the python thanks to this photobooth! in advance thank you so it does not bother you!

OK here is the assemblePicture function from init.py in the cameraFolder.

I am not a programmer and I struggled alot with the math. There is a high chance that some things should have been calculated somewhere else but as mentioned I am not very good at programming

and for it to work you need the _Fancy setting, background and logo. If you want to add that to the Settings just look at Frames.py and you can reverse engineer how to put those settings in.

have fun with it regards

def assemblePicture(self): """my custom Version of assembling Pictures"""

    self.setIdle()

    picture = self._template.copy()
    if(self._fancy):

        if(self._skip_last):

        # -------------- 3 Rotated Pictures
            outer_border = 30
            inner_border = 30
            pic_rotation = 11

            largePics_size = ( int( (self._pic_dims.outputSize[0] - ( outer_border *4))  // 10)*4.6   ,
                            int( (self._pic_dims.outputSize[1] - ( outer_border *4 ) )//10)*4.6)
            evenlargerPics_size = ( int( (self._pic_dims.outputSize[0] - ( outer_border *4))  // 10)*5.5   ,
                            int( (self._pic_dims.outputSize[1] - ( outer_border *4 ) )//10)*5.5)
            logo_size = ( int( (self._pic_dims.outputSize[0] ) //3 ),
                        int( (self._pic_dims.outputSize[1])//2 ) )
            #logo_size = (1206, 2669) #for hardcoded use
            logging.info('size largePicx "{}"'.format(largePics_size))
            logging.info('Size logo "{}"'.format(logo_size))

            # Image 0
            img = Image.open(self._pictures[0])
            img = img.convert('RGBA')
            img.thumbnail(largePics_size)
            logging.info('Image0 inserted with size pre rotation "{}"'.format(img.size))
            img = img.rotate(pic_rotation, expand=True)
            offset = ( outer_border  ,
                    outer_border  )
            picture.paste(img, offset, img)
            logging.info('Image0 inserted with size "{}"'.format(img.size))
            logging.info('largepic size "{}"'.format(largePics_size))

            # Image 1
            img = Image.open(self._pictures[1])
            img = img.convert('RGBA')
            img.thumbnail(largePics_size)
            img_norotated = img.size
            img_norotated_small = img.size
            img = img.rotate(pic_rotation, expand=True)
            img_small = img
            ta =  (img_norotated[1]+outer_border) * math.cos(math.radians(90 - pic_rotation)) ## a = Hypothenuse c * cosinus von beta, beta = 90° - Alpha #not working weil negativ.
            tb = math.sqrt(img_norotated[1] ** 2 - ta ** 2) #b = sqrt(c² - a²)
            logging.info('tb "{}"'.format(tb))
            logging.info('ta "{}"'.format(ta))
            logging.info('ta "{}"'.format((outer_border - round(ta))))
            #offset = ( (outer_border + round(ta)),  
                    #(self._pic_dims.outputSize[1] - outer_border - img.size[1]) ) #b = sqrt(c² - a²)
            #offset = ( ((self._pic_dims.outputSize[0] - outer_border*2 ) //2) - img.size[0],
                    #self._pic_dims.outputSize[1] - outer_border - img.size[1] )
            offset = ((outer_border + round(ta)),
                    (outer_border + round(tb) + outer_border ))
            img_small_offset = offset
            picture.paste(img, offset, img)
            logging.info('Image1 inserted with size "{}"'.format(img.size))

            # Image 2
            img = Image.open(self._pictures[2])
            img = img.convert('RGBA')
            img.thumbnail(evenlargerPics_size)
            img_norotated = img.size
            img = img.rotate(pic_rotation, expand=True)
            img_large = img
            #ta =  (img_norotated_small[1]) * math.cos(math.radians(90 - pic_rotation))
            #ta_d = outer_border * math.cos(math.radians(90 - pic_rotation))
            #tb_d = math.sqrt(outer_border ** 2 - ta_d ** 2)
            #tta = outer_border * math.tan(math.radians(90 - pic_rotation))
            #tta_c = math.sqrt(tta ** 2 + outer_border ** 2)

            da = img_norotated[0] * math.cos(math.radians(90 - pic_rotation)) # a  of the current Pic to get distance from left upper corner of img
            tda = da * math.tan(90 - pic_rotation) 

            #logging.info('ta_d "{}"'.format(ta_d))
            #logging.info('tb_d "{}"'.format(tb_d))
            #logging.info('ta "{}"'.format(ta))
            # offset = ( img.size[0] - round(ta)  + outer_border * 2  + round(tb_d) , ##original 
            #offset = ( img.size[0] - round(ta) + outer_border * 2 , ##working somehow use that in case of not knowing
            offset = ( img_small.size[0] - round(ta) + round(tda) ,
                    outer_border )
            #offset = ( (self._pic_dims.outputSize[0] - outer_border *2 ) //2,
                    #outer_border )
            img_large_offset = offset
            picture.paste(img, offset, img)
            logging.info('Image2 inserted')

            #Logo
            if(self._addlogo):
                if len(self._logo) > 0:
                    logging.info('Using logo "{}"'.format(self._logo))
                    logo = Image.open(self._logo).convert("RGBA")
                    logo = logo.rotate(self._logo_rot, expand=True)
                    logo.thumbnail(logo_size, Image.ANTIALIAS)
                    #offset = (self._pic_dims.outputSize[0] - outer_border - logo.size[0] ,
                        #self._pic_dims.outputSize[1]  - outer_border- logo.size[1] )
                    rest_space = (((self._pic_dims.outputSize[0]-(img_small_offset[0] + img_small.size[0] + logo.size[0]))//2) ,
                                 ((self._pic_dims.outputSize[1]-(img_large_offset[1]+img_large.size[1]+logo.size[1]))//2))
                    offset = (img_small_offset[0] + img_small.size[0] + rest_space[0] , 
                              img_large_offset[1]+img_large.size[1] + rest_space[1])
                    logging.info('Logo offset"{}"'.format(offset))
                    picture.paste(logo,offset,logo)
                    logging.info('Logo inserted')
                else:
                    logging.info('No logo  defined')
            else:
                logging.info('Addlogo set to FALSE')

        else:
            # 4 Pics + logo Layout
            #----------------- AuC Layout 1 big 3 small-----

            outer_border = 40
            inner_border = 10

            smallPics_size = ( int( (self._pic_dims.outputSize[0] - ( outer_border * 2 ) - ( inner_border * 4 )) / 3 ) ,
                                int( (self._pic_dims.outputSize[1] - ( outer_border * 2 ) - ( inner_border * 4 )) / 3 ))
            largePics_size = ( ( smallPics_size[0] * 2 ),
                        ( smallPics_size[1] * 2 ) )
            logo_size = ( int( (self._pic_dims.outputSize[0] - ( inner_border * 2 ) - ( outer_border ) - largePics_size[0]) ),
                            int( (self._pic_dims.outputSize[0] - ( inner_border * 2 ) - ( outer_border ) - smallPics_size[1]) ) )

            logging.info('Size logo "{}"'.format(logo_size))
            #Logo # TODO LOGO pfad in Settings !!
            if(self._addlogo):
                if len(self._logo) > 0:
                    logging.info('Using logo "{}"'.format(self._logo))
                    logo = Image.open(self._logo).convert("RGBA")
                    logo = logo.rotate(self._logo_rot, expand=True)
                    logo.thumbnail(logo_size, Image.ANTIALIAS)
                    offset = (((self._pic_dims.outputSize[0] - largePics_size[0] - outer_border - inner_border) // 2 ) - logo.size[0] // 2 ,
                        ((largePics_size[1]//2) + outer_border )- logo.size[1] //2)
                    logging.info('Logo offset"{}"'.format(offset))
                    picture.paste(logo,offset,logo)
                    logging.info('Logo inserted')
                else:
                    logging.info('No logo  defined')
            else:
                logging.info('Addlogo set to FALSE')

            # Image 0
            img = Image.open(self._pictures[0])
            img = img.convert('RGBA')
            #img = img.rotate(45, expand=True)
            img.thumbnail(largePics_size)
            offset = ( self._pic_dims.outputSize[0] - img.size[0] - outer_border - inner_border ,
                    outer_border )
            picture.paste(img, offset, img)
            logging.info('Image0 inserted with size "{}"'.format(img.size))

            # Image 1
            img = Image.open(self._pictures[1])
            img.thumbnail(smallPics_size)
            offset = ( outer_border + inner_border,
                    self._pic_dims.outputSize[1] - outer_border - img.size[1] )
            picture.paste(img, offset)
            logging.info('Image1 inserted')

            # Image 2
            img = Image.open(self._pictures[2])
            img.thumbnail(smallPics_size)
            offset = ( self._pic_dims.outputSize[0] // 2- img.size[0] // 2,
                    self._pic_dims.outputSize[1] - outer_border - img.size[1] )
            picture.paste(img, offset)
            logging.info('Image2 inserted')

            # Image 3
            img = Image.open(self._pictures[3])
            img.thumbnail(smallPics_size)
            offset = ( self._pic_dims.outputSize[0] - outer_border - img.size[0] - inner_border ,
                    self._pic_dims.outputSize[1] - outer_border - img.size[1] )
            picture.paste(img, offset)
            logging.info('Image3 inserted')

    else:
        for i in range(self._pic_dims.totalNumPictures):
            logging.info('Pic "{}"'.format(i))
            shot = Image.open(self._pictures[i])
            resized = shot.resize(self._pic_dims.thumbnailSize)
            picture.paste(resized, self._pic_dims.thumbnailOffset[i])

        if(self._addlogo):

            if len(self._logo) > 0:
                logging.info('Using logo "{}"'.format(self._logo))
                logo = Image.open(self._logo).convert("RGBA")
                logo = logo.rotate(self._logo_rot, expand=True)
                if(self._skip_last):
                    logo_size = ((self._pic_dims.thumbnailSize[0] / 100)*90,
                                (self._pic_dims.thumbnailSize[1] / 100)*90)
                    logo.thumbnail(logo_size, Image.ANTIALIAS)
                    offset = ((self._pic_dims.thumbnailOffset[self._pic_dims.totalNumPictures])[0]+ (self._pic_dims.thumbnailSize[0] -logo.size[0]) // 2,
                            (self._pic_dims.thumbnailOffset[self._pic_dims.totalNumPictures])[1]+ (self._pic_dims.thumbnailSize[1] -logo.size[1]) // 2)
                else:
                    logo_size = ((self._pic_dims.thumbnailSize[0] / 100)*70,
                                (self._pic_dims.thumbnailSize[1] / 100)*70)
                    logo.thumbnail(logo_size, Image.ANTIALIAS)
                    offset = ((picture.size[0] - logo.size[0]) // 2,
                            (picture.size[1] - logo.size[1]) // 2)

                picture.paste(logo,offset,logo)
                logging.info('Logo inserted')
            else:
                logging.info('No logo  defined')

    byte_data = BytesIO()
    picture.save(byte_data, format='jpeg')
    self._comm.send(Workers.MASTER,
                    StateMachine.CameraEvent('review', byte_data))
    self._pictures = []
thyristor59 commented 5 years ago

awesome ! a big thank you I would do a test on my test version. it seems to me fun to do

reuterbal commented 5 years ago

Thank you for sharing your story! I like the different layouts very much - I'll probably add something similar in the future.

thyristor59 commented 5 years ago

that's what everyone asked me for lotd of the wedding, different layouts, i did not have time to watch but a direct addition without modification of personal file would be perfect reuterbal

tommy1974 commented 5 years ago

Very nice , would u share the project of the PictureBrowser?

MarioJanssen27 commented 5 years ago

Awesome box and the birds are very beautiful! I am amazed by the multiple choice of image layouts! would you have a plan to follow to achieve the same thing at home? I am too bad to do it alone. but I progress in the python thanks to this photobooth! in advance thank you so it does not bother you!

OK here is the assemblePicture function from init.py in the cameraFolder.

I am not a programmer and I struggled alot with the math. There is a high chance that some things should have been calculated somewhere else but as mentioned I am not very good at programming

and for it to work you need the _Fancy setting, background and logo. If you want to add that to the Settings just look at Frames.py and you can reverse engineer how to put those settings in.

have fun with it regards

def assemblePicture(self): """my custom Version of assembling Pictures"""

    self.setIdle()

    picture = self._template.copy()
    if(self._fancy):

        if(self._skip_last):

        # -------------- 3 Rotated Pictures
            outer_border = 30
            inner_border = 30
            pic_rotation = 11

            largePics_size = ( int( (self._pic_dims.outputSize[0] - ( outer_border *4))  // 10)*4.6   ,
                            int( (self._pic_dims.outputSize[1] - ( outer_border *4 ) )//10)*4.6)
            evenlargerPics_size = ( int( (self._pic_dims.outputSize[0] - ( outer_border *4))  // 10)*5.5   ,
                            int( (self._pic_dims.outputSize[1] - ( outer_border *4 ) )//10)*5.5)
            logo_size = ( int( (self._pic_dims.outputSize[0] ) //3 ),
                        int( (self._pic_dims.outputSize[1])//2 ) )
            #logo_size = (1206, 2669) #for hardcoded use
            logging.info('size largePicx "{}"'.format(largePics_size))
            logging.info('Size logo "{}"'.format(logo_size))

            # Image 0
            img = Image.open(self._pictures[0])
            img = img.convert('RGBA')
            img.thumbnail(largePics_size)
            logging.info('Image0 inserted with size pre rotation "{}"'.format(img.size))
            img = img.rotate(pic_rotation, expand=True)
            offset = ( outer_border  ,
                    outer_border  )
            picture.paste(img, offset, img)
            logging.info('Image0 inserted with size "{}"'.format(img.size))
            logging.info('largepic size "{}"'.format(largePics_size))

            # Image 1
            img = Image.open(self._pictures[1])
            img = img.convert('RGBA')
            img.thumbnail(largePics_size)
            img_norotated = img.size
            img_norotated_small = img.size
            img = img.rotate(pic_rotation, expand=True)
            img_small = img
            ta =  (img_norotated[1]+outer_border) * math.cos(math.radians(90 - pic_rotation)) ## a = Hypothenuse c * cosinus von beta, beta = 90° - Alpha #not working weil negativ.
            tb = math.sqrt(img_norotated[1] ** 2 - ta ** 2) #b = sqrt(c² - a²)
            logging.info('tb "{}"'.format(tb))
            logging.info('ta "{}"'.format(ta))
            logging.info('ta "{}"'.format((outer_border - round(ta))))
            #offset = ( (outer_border + round(ta)),  
                    #(self._pic_dims.outputSize[1] - outer_border - img.size[1]) ) #b = sqrt(c² - a²)
            #offset = ( ((self._pic_dims.outputSize[0] - outer_border*2 ) //2) - img.size[0],
                    #self._pic_dims.outputSize[1] - outer_border - img.size[1] )
            offset = ((outer_border + round(ta)),
                    (outer_border + round(tb) + outer_border ))
            img_small_offset = offset
            picture.paste(img, offset, img)
            logging.info('Image1 inserted with size "{}"'.format(img.size))

            # Image 2
            img = Image.open(self._pictures[2])
            img = img.convert('RGBA')
            img.thumbnail(evenlargerPics_size)
            img_norotated = img.size
            img = img.rotate(pic_rotation, expand=True)
            img_large = img
            #ta =  (img_norotated_small[1]) * math.cos(math.radians(90 - pic_rotation))
            #ta_d = outer_border * math.cos(math.radians(90 - pic_rotation))
            #tb_d = math.sqrt(outer_border ** 2 - ta_d ** 2)
            #tta = outer_border * math.tan(math.radians(90 - pic_rotation))
            #tta_c = math.sqrt(tta ** 2 + outer_border ** 2)

            da = img_norotated[0] * math.cos(math.radians(90 - pic_rotation)) # a  of the current Pic to get distance from left upper corner of img
            tda = da * math.tan(90 - pic_rotation) 

            #logging.info('ta_d "{}"'.format(ta_d))
            #logging.info('tb_d "{}"'.format(tb_d))
            #logging.info('ta "{}"'.format(ta))
            # offset = ( img.size[0] - round(ta)  + outer_border * 2  + round(tb_d) , ##original 
            #offset = ( img.size[0] - round(ta) + outer_border * 2 , ##working somehow use that in case of not knowing
            offset = ( img_small.size[0] - round(ta) + round(tda) ,
                    outer_border )
            #offset = ( (self._pic_dims.outputSize[0] - outer_border *2 ) //2,
                    #outer_border )
            img_large_offset = offset
            picture.paste(img, offset, img)
            logging.info('Image2 inserted')

            #Logo
            if(self._addlogo):
                if len(self._logo) > 0:
                    logging.info('Using logo "{}"'.format(self._logo))
                    logo = Image.open(self._logo).convert("RGBA")
                    logo = logo.rotate(self._logo_rot, expand=True)
                    logo.thumbnail(logo_size, Image.ANTIALIAS)
                    #offset = (self._pic_dims.outputSize[0] - outer_border - logo.size[0] ,
                        #self._pic_dims.outputSize[1]  - outer_border- logo.size[1] )
                    rest_space = (((self._pic_dims.outputSize[0]-(img_small_offset[0] + img_small.size[0] + logo.size[0]))//2) ,
                                 ((self._pic_dims.outputSize[1]-(img_large_offset[1]+img_large.size[1]+logo.size[1]))//2))
                    offset = (img_small_offset[0] + img_small.size[0] + rest_space[0] , 
                              img_large_offset[1]+img_large.size[1] + rest_space[1])
                    logging.info('Logo offset"{}"'.format(offset))
                    picture.paste(logo,offset,logo)
                    logging.info('Logo inserted')
                else:
                    logging.info('No logo  defined')
            else:
                logging.info('Addlogo set to FALSE')

        else:
            # 4 Pics + logo Layout
            #----------------- AuC Layout 1 big 3 small-----

            outer_border = 40
            inner_border = 10

            smallPics_size = ( int( (self._pic_dims.outputSize[0] - ( outer_border * 2 ) - ( inner_border * 4 )) / 3 ) ,
                                int( (self._pic_dims.outputSize[1] - ( outer_border * 2 ) - ( inner_border * 4 )) / 3 ))
            largePics_size = ( ( smallPics_size[0] * 2 ),
                        ( smallPics_size[1] * 2 ) )
            logo_size = ( int( (self._pic_dims.outputSize[0] - ( inner_border * 2 ) - ( outer_border ) - largePics_size[0]) ),
                            int( (self._pic_dims.outputSize[0] - ( inner_border * 2 ) - ( outer_border ) - smallPics_size[1]) ) )

            logging.info('Size logo "{}"'.format(logo_size))
            #Logo # TODO LOGO pfad in Settings !!
            if(self._addlogo):
                if len(self._logo) > 0:
                    logging.info('Using logo "{}"'.format(self._logo))
                    logo = Image.open(self._logo).convert("RGBA")
                    logo = logo.rotate(self._logo_rot, expand=True)
                    logo.thumbnail(logo_size, Image.ANTIALIAS)
                    offset = (((self._pic_dims.outputSize[0] - largePics_size[0] - outer_border - inner_border) // 2 ) - logo.size[0] // 2 ,
                        ((largePics_size[1]//2) + outer_border )- logo.size[1] //2)
                    logging.info('Logo offset"{}"'.format(offset))
                    picture.paste(logo,offset,logo)
                    logging.info('Logo inserted')
                else:
                    logging.info('No logo  defined')
            else:
                logging.info('Addlogo set to FALSE')

            # Image 0
            img = Image.open(self._pictures[0])
            img = img.convert('RGBA')
            #img = img.rotate(45, expand=True)
            img.thumbnail(largePics_size)
            offset = ( self._pic_dims.outputSize[0] - img.size[0] - outer_border - inner_border ,
                    outer_border )
            picture.paste(img, offset, img)
            logging.info('Image0 inserted with size "{}"'.format(img.size))

            # Image 1
            img = Image.open(self._pictures[1])
            img.thumbnail(smallPics_size)
            offset = ( outer_border + inner_border,
                    self._pic_dims.outputSize[1] - outer_border - img.size[1] )
            picture.paste(img, offset)
            logging.info('Image1 inserted')

            # Image 2
            img = Image.open(self._pictures[2])
            img.thumbnail(smallPics_size)
            offset = ( self._pic_dims.outputSize[0] // 2- img.size[0] // 2,
                    self._pic_dims.outputSize[1] - outer_border - img.size[1] )
            picture.paste(img, offset)
            logging.info('Image2 inserted')

            # Image 3
            img = Image.open(self._pictures[3])
            img.thumbnail(smallPics_size)
            offset = ( self._pic_dims.outputSize[0] - outer_border - img.size[0] - inner_border ,
                    self._pic_dims.outputSize[1] - outer_border - img.size[1] )
            picture.paste(img, offset)
            logging.info('Image3 inserted')

    else:
        for i in range(self._pic_dims.totalNumPictures):
            logging.info('Pic "{}"'.format(i))
            shot = Image.open(self._pictures[i])
            resized = shot.resize(self._pic_dims.thumbnailSize)
            picture.paste(resized, self._pic_dims.thumbnailOffset[i])

        if(self._addlogo):

            if len(self._logo) > 0:
                logging.info('Using logo "{}"'.format(self._logo))
                logo = Image.open(self._logo).convert("RGBA")
                logo = logo.rotate(self._logo_rot, expand=True)
                if(self._skip_last):
                    logo_size = ((self._pic_dims.thumbnailSize[0] / 100)*90,
                                (self._pic_dims.thumbnailSize[1] / 100)*90)
                    logo.thumbnail(logo_size, Image.ANTIALIAS)
                    offset = ((self._pic_dims.thumbnailOffset[self._pic_dims.totalNumPictures])[0]+ (self._pic_dims.thumbnailSize[0] -logo.size[0]) // 2,
                            (self._pic_dims.thumbnailOffset[self._pic_dims.totalNumPictures])[1]+ (self._pic_dims.thumbnailSize[1] -logo.size[1]) // 2)
                else:
                    logo_size = ((self._pic_dims.thumbnailSize[0] / 100)*70,
                                (self._pic_dims.thumbnailSize[1] / 100)*70)
                    logo.thumbnail(logo_size, Image.ANTIALIAS)
                    offset = ((picture.size[0] - logo.size[0]) // 2,
                            (picture.size[1] - logo.size[1]) // 2)

                picture.paste(logo,offset,logo)
                logging.info('Logo inserted')
            else:
                logging.info('No logo  defined')

    byte_data = BytesIO()
    picture.save(byte_data, format='jpeg')
    self._comm.send(Workers.MASTER,
                    StateMachine.CameraEvent('review', byte_data))
    self._pictures = []

In which file do I have to insert the code? And does anything else have to be done to make it work?


in deutsch

In Welcher Datei muss ich den Code einfügen? Und muss sonst noch was machen damit es klappt?

websta911 commented 5 years ago

Hello, So I forked the latest codebase and now there should no need to second guess where the assemble code goes. Head over and try that. Upon merging my changes into the original one I tried to comment on some of the changes.

Have fun Christoph

thyristor59 commented 5 years ago

just great! I just did a test, everything is perfect!

However, what is the data to modify when I rotate the camera at 90 °?

websta911 commented 5 years ago

Good question, I never thought of that nor tried that.

But all the layout stuff for the fancy layouts is in camera/init.py in the assemble_picture function

The offsets and sizes are guestimated there.

Best regards

On Thu, Sep 19, 2019, 15:58 thyristor59 notifications@github.com wrote:

just great! I just did a test, everything is perfect!

However, what is the data to modify when I rotate the camera at 90 °?

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/reuterbal/photobooth/issues/148?email_source=notifications&email_token=AMQFTDDVHOLLZKUVNPUO3DLQKOAPDA5CNFSM4H426OWKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD7DR5SA#issuecomment-533143240, or mute the thread https://github.com/notifications/unsubscribe-auth/AMQFTDGZWK2XSDAYFIYYS4TQKOAPDANCNFSM4H426OWA .

MarioJanssen27 commented 5 years ago

Good question, I never thought of that nor tried that. But all the layout stuff for the fancy layouts is in camera/init.py in the assemble_picture function The offsets and sizes are guestimated there. Best regards

.

Can someone upload the new full file?

That you only have to make copyright paste?!????

That would be very nice

MarioJanssen27 commented 4 years ago

Traceback (most recent call last): File "/usr/lib/python3.5/runpy.py", line 183, in _run_module_as_main mod_name, mod_spec, code = _get_module_details(mod_name, _Error) File "/usr/lib/python3.5/runpy.py", line 142, in _get_module_details return _get_module_details(pkg_main_name, error) File "/usr/lib/python3.5/runpy.py", line 109, in _get_module_details import(pkg_name) File "/home/pi/photobooth/photobooth/init.py", line 21, in from .main import main File "/home/pi/photobooth/photobooth/main.py", line 33, in from . import camera, gui File "/home/pi/photobooth/photobooth/camera/init.py", line 165 self.setIdle() ^ IndentationError: expected an indented block

I get this error message when I insert the code into init.py. What do I have to do?


in deustch

Ich bekomme diese Fehlermeldung wenn ich den Code in die init.py einfüge. Was muss ich machen?

websta911 commented 4 years ago

Hello,

The code has to go in the assemble_pictures function. In the init.py in the camera subfolder.

But you can check out a working version or compare with my forked version https://github.com/websta911/photobooth

Best regards Christoph

On Sun, Sep 22, 2019, 14:46 MarioJanssen27 notifications@github.com wrote:

Traceback (most recent call last): File "/usr/lib/python3.5/runpy.py", line 183, in _run_module_as_main mod_name, mod_spec, code = _get_module_details(mod_name, _Error) File "/usr/lib/python3.5/runpy.py", line 142, in _get_module_details return _get_module_details(pkg_main_name, error) File "/usr/lib/python3.5/runpy.py", line 109, in _get_module_details import(pkg_name) File "/home/pi/photobooth/photobooth/init.py", line 21, in from .main import main File "/home/pi/photobooth/photobooth/main.py", line 33, in from . import camera, gui File "/home/pi/photobooth/photobooth/camera/init.py", line 165 self.setIdle() ^ IndentationError: expected an indented block

I get this error message when I insert the code into init.py. What do I have to do?

in deustch

Ich bekomme diese Fehlermeldung wenn ich den Code in die init.py einfüge. Was muss ich machen?

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/reuterbal/photobooth/issues/148?email_source=notifications&email_token=AMQFTDFNFGXB7FCWVYHNA6TQK5SJRA5CNFSM4H426OWKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD7JFSCA#issuecomment-533879048, or mute the thread https://github.com/notifications/unsubscribe-auth/AMQFTDASHMZYLGYUN2E3T43QK5SJRANCNFSM4H426OWA .

MarioJanssen27 commented 4 years ago

Okay, that works, but now I don't have lightning! What do I have to change or what has changed for the flash to work again????


In deutsch

Okay das funktioniert aber jetzt habe ich keinen Blitz mehr! Was muss ich ändern oder was hat sich geändert damit der Blitz wieder funktioniert????

websta911 commented 4 years ago

Hello,

great o hear that that worked. I guess the camera triggers the flash when needed? or do you have that hooked up to the raspberry pi? From the parts you are telling me here I cannot make a good guess what could be the problem.

Does the flash trigger if you use the camera manually? Did you make any changes to the camera? Is it bright enough so the camera does not need a flash? If you try your old version does the flash trigger under the same circumstances?

If you have questions and issues it is easier to suggest solutions if there is some kind of context the problem appears in.

I do not use a Flash in my setup I just have led Lightning, so I have no experience with flash and the photobooth. best regards Christoph

On Mon, Sep 23, 2019 at 10:56 AM MarioJanssen27 notifications@github.com wrote:

Okay, that works, but now I don't have lightning! What do I have to change or what has changed for the flash to work again????

In deutsch

Okay das funktioniert aber jetzt habe ich keinen Blitz mehr! Was muss ich ändern oder was hat sich geändert damit der Blitz wieder funktioniert????

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/reuterbal/photobooth/issues/148?email_source=notifications&email_token=AMQFTDE5VDL7GEBIY3FEHPLQLCAE3A5CNFSM4H426OWKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD7KGOPQ#issuecomment-534013758, or mute the thread https://github.com/notifications/unsubscribe-auth/AMQFTDG4TGGPCVAATX6QCYTQLCAE3ANCNFSM4H426OWA .

MarioJanssen27 commented 4 years ago

The flash is connected directly to the camera. The flash is always off. Why don't I know until now that was never a problem. With the new version the flash only works when the Photobooth is started. With the photos there is no flash.

If I operate the camera Manuel the flash triggers. I made no changes to the camera. I made test with bright and dark room both times no flash. With the old version (SD-Backup) the flash fires.

Can I compare a file that has changed between my version and the new version?

Two errors are displayed during installation. "see photos"

20190923_142908 20190923_142854


in deutsch

Der Blitz ist direkt an der Kamera angeschlossen. Der Blitz eigentlich immer aus. Wieso weis ich auch nicht bis jetzt war das nie ein Problem. Bei der neuen Version arbeitet der blitz nur beim start der Photobooth. Bei den Fotos kommt kein Blitz.

Wenn ich die Kamera Manuel betätige löst der Blitz aus. Ich keine Änderungen an der Kamera vorgenommen. Ich habe Test gemacht bei hellen und dunkeln Raum beides mal kein Blitz. Bei der alten Version (SD-Backup) löst der Blitz aus.

Kann ich eine Datei vergleichen was sich geändert hat zwischen meiner Version und der neuen Verison?

Beim installieren werden zwei Fehler angezeigt. "siehe Fotos"

websta911 commented 4 years ago

Hello,

There were no pictures attached to this email.

I tried with my camera Canon eos m3 and the onboard flash fired everytime.

I guess you are using an extra flash. Since I do not have one I cannot test that and I am not completely sure what could be the problem. But there were changes concerning camera configs you can find it in camera directory. I don't know if that could be the reason that is happening but you can try to find out by looking into the code of the module you are using to control the camera.

There is also a photobooth.log file which is in the location you are starting the photobooth from ( default would be /home/pi/photobooth if you cloned the git repo there). You can delete or rename it, then a new one is created when you run it again. Then you have a somewhat clear picture of what is going on.

Hope you can figure it out. Best regards

On Mon, Sep 23, 2019, 15:31 MarioJanssen27 notifications@github.com wrote:

The flash is connected directly to the camera. The flash is always off. Why don't I know until now that was never a problem. With the new version the flash only works when the Photobooth is started. With the photos there is no flash.

If I operate the camera Manuel the flash triggers. I made no changes to the camera. I made test with bright and dark room both times no flash. With the old version (SD-Backup) the flash fires.

Can I compare a file that has changed between my version and the new version?

Two errors are displayed during installation. "see photos"

in deutsch

Der Blitz ist direkt an der Kamera angeschlossen. Der Blitz eigentlich immer aus. Wieso weis ich auch nicht bis jetzt war das nie ein Problem. Bei der neuen Version arbeitet der blitz nur beim start der Photobooth. Bei den Fotos kommt kein Blitz.

Wenn ich die Kamera Manuel betätige löst der Blitz aus. Ich keine Änderungen an der Kamera vorgenommen. Ich habe Test gemacht bei hellen und dunkeln Raum beides mal kein Blitz. Bei der alten Version (SD-Backup) löst der Blitz aus.

Kann ich eine Datei vergleichen was sich geändert hat zwischen meiner Version und der neuen Verison?

Beim installieren werden zwei Fehler angezeigt. "siehe Fotos"

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/reuterbal/photobooth/issues/148?email_source=notifications&email_token=AMQFTDGHNXLB7YJ5RM766HLQLDAKZA5CNFSM4H426OWKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD7K3N7A#issuecomment-534099708, or mute the thread https://github.com/notifications/unsubscribe-auth/AMQFTDDUVOZ76ZNF3MQPBU3QLDAKZANCNFSM4H426OWA .

MarioJanssen27 commented 4 years ago

The cable has a loose contact

MarioJanssen27 commented 4 years ago

The autostart (--run) does not work! What has changed? Or do you have another solution?


in deutsch

Der Autostart (--run) funktioniert nicht! Was hat sich geändert? Oder hast du eine andere Lösung?

websta911 commented 4 years ago

Hello, Okay do you have error messages upon starting? What are does? Does it not start at all? What exactly are you calling from where? The autostart.sh? Or in the virtual environment (usually .venv) "python -m photobooth -- run" Are there messages in the photobooth.log?

It should work I tried it today via autostart.sh file from the root folder of the photobooth folder.

Regards Christoph

On Sun, Oct 6, 2019, 16:55 MarioJanssen27 notifications@github.com wrote:

The autostart (--run) does not work! What has changed? Or do you have another solution?

in deutsch

Der Autostart (--run) funktioniert nicht! Was hat sich geändert? Oder hast du eine andere Lösung?

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/reuterbal/photobooth/issues/148?email_source=notifications&email_token=AMQFTDFAH7EO37MHLS2LNILQNH35LA5CNFSM4H426OWKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEAOL6JA#issuecomment-538754852, or mute the thread https://github.com/notifications/unsubscribe-auth/AMQFTDEIVFGOIA6QKRO52RLQNH35LANCNFSM4H426OWA .

Tinker232 commented 4 years ago

Hiiii, thanks for the great modifications. The fancy layouts are pretty fantastic!!! The next step would be a further layer in the UI (e.g. after pressing the "hit me" Button) for choosing between the different layouts. Otherwise a random feature will work fine as well and would be easier to realize I guess... But, I think the configs / settings, which also includes the layout are imported only once by startup the photobooth, isn´t it? Thanks Tina :-)

websta911 commented 4 years ago

Hello,. The picture Library is public now. You can find that in my GitHub right here: https://github.com/websta911/pictureLibrary

Have fun.

Tinker232 commented 4 years ago

Hey @websta911 it is possibile to make only a single shot without any layouts? LG Tina

websta911 commented 4 years ago

ello Tina, yes it is possible, you have to make some changes, in photobooth/photobooth/camera/PictureDimensions.py

After line 80 add the if clause and else path around the for block.

In the GitHub repo the changes are already in so you can copy them out of there.

Have fun Christoph

On Wed, Nov 6, 2019, 17:52 Tinker232 notifications@github.com wrote:

Hey @websta911 https://github.com/websta911 it is possibile to make only a single shot without any layouts? LG Tina

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/reuterbal/photobooth/issues/148?email_source=notifications&email_token=AMQFTDG4G6CMNLLOYY6VSGDQSLY4TA5CNFSM4H426OWKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEDHHAQY#issuecomment-550400067, or unsubscribe https://github.com/notifications/unsubscribe-auth/AMQFTDDQS3ZKOX5F2GSAZ43QSLY4TANCNFSM4H426OWA .

AndPDale commented 3 years ago

@websta911 - Great upgrade and the additional layouts are a good addition. I see in your intro description that you initially used a camera and raspberry pi camera for the preview. Are you able to share the code to enable this please, as this is a feature that would enable my setup to function?

Currently my nikon D90 will autofocus but not show a preview on gphoto-commandline but if i change to cffi I get preview but no autofocus. So i plan to use the picamera for the preview. Thanks for your help

websta911 commented 3 years ago

@websta911 - Great upgrade and the additional layouts are a good addition. I see in your intro description that you initially used a camera and raspberry pi camera for the preview. Are you able to share the code to enable this please, as this is a feature that would enable my setup to function?

Currently my nikon D90 will autofocus but not show a preview on gphoto-commandline but if i change to cffi I get preview but no autofocus. So i plan to use the picamera for the preview. Thanks for your help

Hi, I thought about that but could not find an old version with this setting in place. But I think that is because I only did that in the first version of the photobooth where it all was depending on pygame, since the rewrite which is the current version I think I never implement that because I already had a preview capable camera. So I am sorry but I do not have a solution for you.

best regards Christoph