@@ -488,6 +488,11 @@ def __countdown_set_led(self,state):
488
488
pass
489
489
490
490
def __show_countdown (self ,countdown ,annotate_size = 160 ):
491
+ '''wrapper function to select between overlay and text countdowns'''
492
+ #self.__show_text_countdown(countdown,annotate_size=annotate_size)
493
+ self .__show_overlay_countdown (countdown )
494
+
495
+ def __show_text_countdown (self ,countdown ,annotate_size = 160 ):
491
496
''' display countdown. the camera should have a preview active and the resolution must be set'''
492
497
led_state = False
493
498
self .__countdown_set_led (led_state )
@@ -513,7 +518,86 @@ def __show_countdown(self,countdown,annotate_size=160):
513
518
led_state = not led_state
514
519
self .__countdown_set_led (led_state )
515
520
self .camera .annotate_text = ""
521
+
522
+ def __show_overlay_countdown (self ,countdown ):
523
+ """Display countdown as images overlays"""
524
+ #COUNTDOWN_OVERLAY_IMAGES
525
+ led_state = False
526
+ self .__countdown_set_led (led_state )
527
+
528
+ self .camera .preview .fullscreen = True
529
+ self .camera .preview .hflip = True #Mirror effect for easier selfies
530
+ #for some reason camera.preview.window =(0,0,0,0)
531
+ #bbox = self.camera.preview.window
532
+ #preview_width = bbox[2]
533
+ #preview_height = bbox[3]
534
+ preview_size = self .camera .resolution
535
+ preview_width = preview_size [0 ]
536
+ preview_height = preview_size [1 ]
537
+
538
+ overlay_height = int (preview_height * 0.2 )
539
+ print preview_size
540
+ print preview_width , preview_height , overlay_height
541
+
542
+ ## prepare overlay images (resize)
543
+ overlay_images = []
544
+ for i in range (countdown ):
545
+ if i >= len (COUNTDOWN_OVERLAY_IMAGES ):
546
+ break ;
547
+ #read overlay image
548
+ im = Image .open (COUNTDOWN_OVERLAY_IMAGES [i ])
549
+ #resize to 20% of height
550
+ im .thumbnail ((preview_width ,overlay_height ))
551
+
552
+ #overlays should be padded to 32 (width) and 16 (height)
553
+ pad_width = int ((preview_width + 31 ) / 32 ) * 32
554
+ pad_height = int ((preview_height + 15 ) / 16 ) * 16
555
+
556
+ padded_overlay = Image .new ('RGBA' , (pad_width , pad_height ))
557
+ # Paste the original image into the padded one (centered)
558
+ padded_overlay .paste (im , ( int ((preview_width + im .size [0 ])/ 2.0 ), int ((preview_height + im .size [1 ])/ 2.0 )))
559
+ overlay_images .append (padded_overlay )
560
+ ## All images loaded at the right resolution
516
561
562
+ #Change overlay every second and blink led
563
+ for i in range (countdown ):
564
+ #what overlay image to select:
565
+ overlay_image = None
566
+ overlay_image_num = countdown - 1 - i #5-1-0 ==> 4 ; 5-1-4 ==> 0
567
+ if overlay_image_num >= len (overlay_images ):
568
+ overlay_image = overlay_images [len (overlay_images )- 1 ]
569
+ elif overlay_image_num < 0 :
570
+ overlay_image = None
571
+ else :
572
+ overlay_image = overlay_images [overlay_image_num ]
573
+ ## Add overlay to image
574
+ overlay = None
575
+ if overlay_image != None :
576
+ #create overlay
577
+ overlay = self .camera .add_overlay (overlay_image .tobytes (), size = overlay_image .size )
578
+ #move it on top of preview
579
+ overlay .layer = 3
580
+ #change transparency
581
+ overlay .alpha = 128
582
+ #flip it horizontally (because preview is flipped)
583
+ #overlay.hflip = True
584
+
585
+ if i < countdown - 2 :
586
+ # slow blink until -2s
587
+ time .sleep (1 )
588
+ led_state = not led_state
589
+ self .__countdown_set_led (led_state )
590
+ else :
591
+ # fast blink until the end
592
+ for j in range (5 ):
593
+ time .sleep (.2 )
594
+ led_state = not led_state
595
+ self .__countdown_set_led (led_state )
596
+ if overlay != None :
597
+ self .camera .remove_overlay (overlay )
598
+
599
+
600
+
517
601
def refresh_auth (self ):
518
602
""" refresh the oauth2 service (regularly called)"""
519
603
# useless if we don't need image upload
0 commit comments