p.s: scale-to-fit might be interesting for you and if you don't care about 
extra options (for background/alpha etc.) you can construct the pict with 
(bitmap path) directly instead of (bitmap (make-object bitmap% ...))
p.p.s: I think there was also a way to convert/use images within picts or 
the other way around but I currently can't find it...  ...I did find it: 
pict/convert
a little bit more example code options / some might be useful for you or 
other people (I partly write this as a note to myself)

#lang racket

(require (only-in 2htdp/image circle)
         (except-in pict circle)
         pict/convert)

(module+ main
  (define c (circle 708 "solid" "blue"))
  (displayln "pict-convertible:")
  (pict-convertible? c)
  (define p (pict-convert c))
  (define p2 (frame (scale-to-fit p 1440 (pict-height p) #:mode 'inset)))
  (send (pict->bitmap p2) save-file "example.png" 'png)
  (send (pict->bitmap p) save-file "test.png" 'png)
  
  (make-directory* "./resized")
  (define resize (resizer "." "./resized" 1440))
  (resize 708 1100 "test.png"))

(define ((resizer source target max-width) width height filename)
  (define p (bitmap (build-path source filename)))
  ;; (pict-width p) (pict-height p) would give the dimmensions of the 
incoming image
  ;; maybe that could be used instead of the hardcoded arguments, if that 
is possible for the usecase
  
  ;; this is a pict based variant with scaling (maybe you don't need 
scaling)
  ;; maybe you need something a little bit different
  ;; maybe scale-to-fit with certain parameters may be enough, or you can 
keep using your 2htdp/image
  ;; version and you could convert it to a pict with pict-convert if you 
want to use pict or bitmap% functionality
  (define p2
    (cc-superimpose (filled-rectangle max-width height #:color "white" 
#:draw-border? #f)
                    (scale-to-fit p (- max-width width) height #:mode 
'inset)))
  (send (pict->bitmap p2)
        save-file (build-path target filename) 'png))

;; -------------------------------------------------------------
;; everything below this is completely optional and I only do it because I 
wanted to try it
;; -------------------------------------------------------------
;; because this contract is defined on the module boundary it won't work 
within this module
;; [define/contract could be used to define it on the function boundary]
;; we could use a ->i contract to specify that width has to be <= max-width
(require racket/contract)
(define pathish/c (or/c path-string? path-for-some-system? 'up 'same))
(provide
 (contract-out
  [resizer (->i ([source pathish/c]
                 [target pathish/c]
                 [max-width exact-nonnegative-integer?])
                [result (max-width) (->i ([width (and/c 
exact-nonnegative-integer? (<=/c max-width))]
                                          [height 
exact-nonnegative-integer?]
                                          [filename string?])
                                         [result () boolean?])])]))

(module* contract-test racket
  (require (submod "..")) ;; require enclosing module

  ;; testing the contract from a submodule similar to requiring from a 
different file
  (define resize (resizer "." "./resized" 1440))
  (resize 708 1100 "test.png") ;; works
  (resize 1708 1100 "test.png")) ;; contract error

;; to execute contract-test submodule use this in drracket-repl:
;; (require (submod "." contract-test))


[email protected] schrieb am Donnerstag, 13. Mai 2021 um 01:04:41 UTC+2:

> Personally I use pict and racket/draw instead of htdp/image, because 
> save-image is png only.
> Pict to transform or load the image, racket/draw's bitmap% to save and/or 
> load the image
> (sidenote: in general I find pict more pleasant to work with, but that may 
> be subjective):
>
> (require pict
>          racket/draw)
>
> ;; this is a rough sketch of the image functions I use
>
> ;; make-object 2nd variant: 
> https://docs.racket-lang.org/draw/bitmap_.html?q=bitmap%25#%28constructor._%28%28lib._racket%2Fdraw..rkt%29._bitmap~25%29%29
> (define b (make-object bitmap% filename-or-port image-type-see-docs #f 
> #t)) ;; background color #f, complain on failure #t
> (define p (bitmap b)) ;; use bitmap% as pict
> ;; use pict functions to transform pict
> (define p2 (scale-to-fit p ...))
> ;; other pict transforms
> (define p3 (inset p2 30 0))
> ;; saving the transformed file
> (send (pict->bitmap p3) save-file out 'png) ;; other file types possible
>
> [email protected] schrieb am Mittwoch, 12. Mai 2021 um 15:06:02 UTC+2:
>
>> Dan, that's awesome. Thank you.
>>
>> Martin, I would love some way to extract the image metadata from each of 
>> the files outputted by Dan's function. All my function does is take the 
>> current width and height and apply some math to return some new values, so 
>> right now I'm just manually going into finder, looking at the images width 
>> and height, and plugging those values into my function. 
>>
>> On Tuesday, May 11, 2021 at 7:31:15 PM UTC-6 [email protected] wrote:
>>
>>> So to clarify, you want something like the following (pseudocode)?
>>>
>>> (define (process-image transform image-file-data)
>>>    (let* ([path (get-full-path image-file-data)]
>>>           [image (bitmap/file path)]
>>>           [new-image (transform image)])
>>>     (save-image new-image path))
>>>
>>> (define (process-file path)
>>>   (let ([image-file-data (extract-image-metadata path)])
>>>      (process-image resize image-file-data)))
>>>
>>> (map process-file (find-all-images directory))
>>>
>>> One question - where do the new width and height of each image come 
>>> from, if you are reading the list of filenames from a directory?
>>>
>>> martin
>>>              
>>>
>>> On Tue, May 11, 2021 at 3:42 PM Robert Haisfield <[email protected]> 
>>> wrote:
>>>
>>>> Okay, so I figured out how to do what I want on individual photos using 
>>>> bitmap/file and 2htdp/image, but I'm trying to find a more programmatic 
>>>> way 
>>>> to do it. Basically, I'd love to create a data structure that feeds into 
>>>> the file path, width, and height into the image-resizer function. Even 
>>>> better if I could point the function at a directory, it finds all of the 
>>>> images in it, and creates the data structure for me. Any ideas?
>>>>
>>>> *No, I'm not trying to just resize photos (this would be much easier if 
>>>> that's all I had to do), the thing I'm working with requires me to add 
>>>> whitespace to the sides of the images to have them display properly.*
>>>>
>>>> [image: CleanShot 2021-05-11 at [email protected]]
>>>>
>>>> On Tuesday, May 11, 2021 at 3:06:20 PM UTC-6 Jens Axel Søgaard wrote:
>>>>
>>>>> Hi Robert,
>>>>>
>>>>> There are some bindings for Magick in the example folder for the FFI 
>>>>> library.
>>>>>
>>>>>
>>>>> https://github.com/racket/racket/tree/master/pkgs/racket-doc/ffi/examples
>>>>>
>>>>> The bindings are in magic.rkt and examples of use are in 
>>>>> use-magick.rkt (see the bottom).
>>>>>
>>>>> /Jens Axel
>>>>>
>>>>>
>>>>> Den tir. 11. maj 2021 kl. 22.15 skrev 'John Clements' via Racket Users 
>>>>> <[email protected]>:
>>>>>
>>>>>> Racket has the ability to read a variety of different image files. I 
>>>>>> would go first to 2htdp/image’s “bitmap/file” to read images. 
>>>>>> “save-image” 
>>>>>> can write images (but only as png files). I believe there are also an 
>>>>>> array 
>>>>>> of lower-level image manipulation functions that are likely to have a 
>>>>>> less 
>>>>>> friendly interface :).
>>>>>>
>>>>>> Apologies in advance for any misleading information I might be 
>>>>>> providing….
>>>>>>
>>>>>> John
>>>>>>
>>>>>> > On May 11, 2021, at 1:09 PM, Robert Haisfield <
>>>>>> [email protected]> wrote:
>>>>>> > 
>>>>>> > Alternatively, does the normal images function for Racket work? 
>>>>>> When I was looking through the documentation I saw a lot about creating 
>>>>>> shapes but not about using image files.
>>>>>> > 
>>>>>> > On Tuesday, May 11, 2021 at 2:03:33 PM UTC-6 Robert Haisfield wrote:
>>>>>> > Hmm does the video language work for image files? If so, then I 
>>>>>> think it might work.
>>>>>> > 
>>>>>> > On Tuesday, May 11, 2021 at 9:03:35 AM UTC-6 Sage Gerard wrote:
>>>>>> > I hope that has what Robert is looking for, but I don't recognize 
>>>>>> that speech. In fact, I have a false memory, because I'm not finding the 
>>>>>> speech I'm looking for on https://con.racket-lang.org/2018/#speakers
>>>>>> > 
>>>>>> > On 5/11/21 10:19 AM, Bruce O'Neel wrote:
>>>>>> >> This might be it.
>>>>>> >> 
>>>>>> >> (seventh RacketCon): Leif Andersen -- Movies as Programs: The 
>>>>>> Story of a Racket - YouTube
>>>>>> >> 
>>>>>> >> 
>>>>>> >> 
>>>>>> >> 
>>>>>> >> 
>>>>>> >> 11 May 2021 15:30 Sage Gerard <[email protected]> wrote:
>>>>>> >> I don't know of one off hand, but I believe RacketCon 2018 (?) 
>>>>>> included a presenter that showed a PostScript-like DSL for designers and 
>>>>>> artists.  If pict not cover your needs, maybe dig into the presentations?
>>>>>> >> 
>>>>>> >> Failing that, can you show what you'd hope the syntax would look 
>>>>>> like? That would probably help point you in the right direction,
>>>>>> >> 
>>>>>> >> On 5/11/21 9:26 AM, Robert Haisfield wrote:
>>>>>> >>> I have to do a bunch of .jpg and .png image resizings and was 
>>>>>> looking for a programmatic way to do it. Is their a Racket DSL for this? 
>>>>>> --
>>>>>> >>> You received this message because you are subscribed to the 
>>>>>> Google Groups "Racket Users" group.
>>>>>> >>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>> send an email to [email protected].
>>>>>> >>> To view this discussion on the web visit 
>>>>>> https://groups.google.com/d/msgid/racket-users/0d576c32-7d4d-4944-9cbc-c12f04406fccn%40googlegroups.com
>>>>>> .
>>>>>> >> -- ~slg --
>>>>>> >> You received this message because you are subscribed to the Google 
>>>>>> Groups "Racket Users" group.
>>>>>> >> To unsubscribe from this group and stop receiving emails from it, 
>>>>>> send an email to [email protected].
>>>>>> >> To view this discussion on the web visit 
>>>>>> https://groups.google.com/d/msgid/racket-users/6e3aacdc-015b-2484-3bee-0c08e3fb612d%40sagegerard.com
>>>>>> .
>>>>>> >> 
>>>>>> >> -- 
>>>>>> >> You received this message because you are subscribed to the Google 
>>>>>> Groups "Racket Users" group.
>>>>>> >> To unsubscribe from this group and stop receiving emails from it, 
>>>>>> send an email to [email protected].
>>>>>> >> To view this discussion on the web visit 
>>>>>> https://groups.google.com/d/msgid/racket-users/1620742795-01b81de5d6862fd390ec60605ee3bc9d%40pckswarms.ch
>>>>>> .
>>>>>> > --
>>>>>> > ~slg
>>>>>> > 
>>>>>> > 
>>>>>> > -- 
>>>>>> > You received this message because you are subscribed to the Google 
>>>>>> Groups "Racket Users" group.
>>>>>> > To unsubscribe from this group and stop receiving emails from it, 
>>>>>> send an email to [email protected].
>>>>>> > To view this discussion on the web visit 
>>>>>> https://groups.google.com/d/msgid/racket-users/b6a89a78-c92c-41c1-960a-49d64d8a5366n%40googlegroups.com
>>>>>> .
>>>>>>
>>>>>> -- 
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "Racket Users" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>> send an email to [email protected].
>>>>>>
>>>>> To view this discussion on the web visit 
>>>>>> https://groups.google.com/d/msgid/racket-users/404c8fad-befc-4b01-8728-48ce9b912117%40mtasv.net
>>>>>> .
>>>>>>
>>>>>
>>>>>
>>>>> -- 
>>>>> -- 
>>>>> Jens Axel Søgaard
>>>>>
>>>>> -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "Racket Users" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to [email protected].
>>>>
>>> To view this discussion on the web visit 
>>>> https://groups.google.com/d/msgid/racket-users/9266c91c-83a6-4d78-95c0-d70c29e4b4e3n%40googlegroups.com
>>>>  
>>>> <https://groups.google.com/d/msgid/racket-users/9266c91c-83a6-4d78-95c0-d70c29e4b4e3n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/6e42d0b9-07a5-4720-8a0e-d01f99786636n%40googlegroups.com.

Reply via email to