7
$\begingroup$

Inspired from :

Fit an image within a Rectangle [] in Graphics

I would like now to fit an image within a Rectangle[] with rounded edges as shown in the example below :

enter image description here

Is it possible ?

$\endgroup$
1
  • 2
    $\begingroup$ You need to use RoundingRadius as an option in Rectangle like Graphics[Rectangle[{0, 0}, {2, 1}, RoundingRadius -> 0.3]]. $\endgroup$
    – kglr
    Feb 16, 2012 at 20:12

2 Answers 2

12
$\begingroup$

Using pieces from the linked answers, and Heike's code:

Text piece:

 txt1 = Take[
 ExampleData[{"Text", "LoremIpsum"}, "Lines"], {1, -1, 2}][[1]] //
 StringTake[#, 330] &;

Image piece:

 pic = Import["http://dailytechgadgets.files.wordpress.com/2011/02/old-ferrari.jpg"];

And Heike's code for rectangles:

 rec[ll_, ur_, pic_] := 
 Module[{crop, boxrat}, 
 boxrat = #2/#1 & @@ MapThread[Abs[#2 - #1] &, {ll, ur}]; 
 crop = ImageCrop[pic, Transpose[{ImageDimensions[pic]}], 
 AspectRatio -> boxrat]; 
 Inset[crop, Min /@ Transpose[{ll, ur}], {Left, Bottom}, 
 Abs[ur - ll]]]

and Heike's code again for putting all together -- just adding RoundingRadius to rectangle objects and commenting out lines that produce lines--:

 Graphics[{EdgeForm[{Thickness[0.005`], Black}], FaceForm[White], 
 Rectangle[{0, 0}, {160, 90}, RoundingRadius -> 4], 
 FaceForm[Darker[Gray]], 
 Rectangle[{0, 0}, {80, 63}, 
 RoundingRadius -> 4],(*code for picture*){rec[{80, 0}, {160, 63}, 
 pic], FaceForm[Opacity[0]], 
 Rectangle[{80, 0}, {160, 63}, 
 RoundingRadius -> 4]},(*code for text*)
 Inset[Pane[
 Style[txt1, 12, TextAlignment -> Left], {Scaled[1], 
 Scaled[0.75`]}, Alignment -> Center, 
 ImageSizeAction -> "Scrollable"], {0, 8}, {Left, Bottom}, {78,67}], 
 Flatten[Transpose[{Flatten[(Table[
      RandomChoice[{GrayLevel[0.15`], c0[[#1]]}], {3}] &) /@ 
   Range[2, 4, 1]], 
 MapThread[
  Function[{Xs, Ys}, 
   Rectangle[{Xs, Ys}, {Xs + 16, Ys + 9}, 
    RoundingRadius -> 4]], {Flatten[Table[Range[0, 32, 16], {3}]],
    Flatten[(Table[#1, {3}] &) /@ Range[63, 81, 9]]}]}]](*,{Black,
 Thickness[0.005`],Line[{{0,63},{159,63}}]}*)}, 
 PlotRange -> {{0, 160}, {0, 90}}, Method -> {"ShrinkWrap" -> True}, 
 ImagePadding -> 2, ImageMargins -> 0, ImageSize -> 500]

produces:

image output

You need further refinements to clean up. In particular, the image needs to be masked with a rectangle with rounded corners.

EDIT: For masking an image with a round-cornered reactangle, play with the parameters of Rectangle in

 pic2 = ImageAdd[ pic, 
 Graphics[{Black, Rectangle[{2, 1}, {4, 2}, RoundingRadius -> .2]}]]

Update: For better masking using SetAlphaChannel and better handling of image size (Thanks: @ssch and @Jens)

roundImage[img_, r_] := Module[{dim = ImageDimensions[img], sr}, 
sr = Max[dim]*r; 
SetAlphaChannel[img, 
   Graphics[{White, Rectangle[Scaled[{0, 0}], Scaled[{1, 1}], RoundingRadius -> sr]},
 Background -> Black, PlotRangePadding -> 0, 
 PlotRange -> {{0, 0}, dim}\[Transpose], AspectRatio -> Automatic] ]]
$\endgroup$
3
  • $\begingroup$ In case you want to layer these rectangles on top of other graphics, it may be a slight improvement to change the masking procedure to an actual alpha mask by doing something like this: pic2 = SetAlphaChannel[pic, Graphics[{White, Rectangle[{2, 1}, {4, 2}, RoundingRadius -> .2]}, Background -> Black, PlotRangePadding -> None]] (you'll see the difference only if you display the result with a background. $\endgroup$
    – Jens
    Feb 17, 2012 at 18:51
  • $\begingroup$ I made a function to automate the handling of image size: roundImage[img_, r_] := Module[{dim = ImageDimensions[img], sr}, sr = Max[dim]*r; SetAlphaChannel[img, Graphics[{White, Rectangle[Scaled[{0, 0}], Scaled[{1, 1}], RoundingRadius -> sr]}, Background -> Black, PlotRangePadding -> 0, PlotRange -> {{0, 0}, dim}\[Transpose], AspectRatio -> Automatic] ]] $\endgroup$
    – ssch
    Nov 26, 2012 at 17:45
  • $\begingroup$ @ssch and Jens,thank you both. Will update with your suggestions. $\endgroup$
    – kglr
    Nov 26, 2012 at 22:18
6
$\begingroup$

You can also use Framed to frame e.g. Text elements in your graphics, which also takes the RoundingRadius option. The size of the resulting rounded frame is depending on the text (or other) element.

A quick´n dirty version of your theme could be:

Framed[Row[{Framed[Style[Text[" $ "], 40, Bold, Magenta], 
    RoundingRadius -> 5], "                        "}], 
 RoundingRadius -> 5, FrameMargins -> -1]

enter image description here

or within a Graphics context:

Graphics[Text[
    Framed[Style["Hello!", RandomReal[{2, 20}]], RoundingRadius -> 10,
      Background -> 
      Directive[Hue[RandomReal[]], Opacity[RandomReal[]]]], #] & /@ 
  RandomReal[{0, 1}, {50, 2}], ImageSize -> 480]

enter image description here

$\endgroup$
1
  • $\begingroup$ In fact, there is a bit of colour bleeding over the black outline at the lower and right edges which does not seem to appear with rounded rectangles (as in kguler´s answer). Otherwise the rounding works nicely. $\endgroup$
    – Yves Klett
    Feb 17, 2012 at 12:56

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.