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.