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))


kamist...@gmail.com 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
>
> roberthh...@gmail.com 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 martin...@gmail.com 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 <roberthh...@gmail.com> 
>>> 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 16.31...@2x.png]
>>>>
>>>> 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 
>>>>> <racket...@googlegroups.com>:
>>>>>
>>>>>> 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 <
>>>>>> roberthh...@gmail.com> 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 <sa...@sagegerard.com> 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 racket-users...@googlegroups.com.
>>>>>> >>> 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 racket-users...@googlegroups.com.
>>>>>> >> 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 racket-users...@googlegroups.com.
>>>>>> >> 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 racket-users...@googlegroups.com.
>>>>>> > 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 racket-users...@googlegroups.com.
>>>>>>
>>>>> 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 racket-users...@googlegroups.com.
>>>>
>>> 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 racket-users+unsubscr...@googlegroups.com.
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