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 ?
Answer
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] ]]
Comments
Post a Comment