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 :
Is it possible ?
Mathematica Stack Exchange is a question and answer site for users of Wolfram Mathematica. It only takes a minute to sign up.
Sign up to join this communityInspired 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 :
Is it possible ?
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:
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] ]]
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$
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]
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]
RoundingRadius
as an option inRectangle
likeGraphics[Rectangle[{0, 0}, {2, 1}, RoundingRadius -> 0.3]]
. $\endgroup$