Rotating and cropping are two basic photo-editing actions. ActiveX/Java Uploader provides the built-in image editor to perform these actions manually, you can also configure ActiveX/Java Uploader to rotate and crop images automatically. This topic consists of two parts, namely, rotating images and cropping images, each tells how to configure ActiveX/Java Uploader to upload edited versions of images and edit images automatically.
There are two approaches to rotating images in ActiveX/Java Uploader:
By default manual rotation is enabled in ActiveX/Java Uploader. It means that a user can rotate images either by clicking the rotation control or using the image editor. To upload rotated images you just need to specify a Converter with Thumbnail Mode, as it is shown in the example below.
<aur:Uploader ID="Uploader1" runat="server"> <Converters> <aur:Converter Mode="*.*=Thumbnail" ThumbnailFitMode="ActualSize" /> </Converters> </aur:Uploader>
$uploader = new Uploader("Uploader1"); $converters = &$uploader->getConverters(); $converter = new Converter(); $converter->setMode("*.*=Thumbnail"); $converter->setThumbnailFitMode("ActualSize"); $converters[] = $converter;
var u = $au.uploader({ id: 'Uploader1', converters: [{mode: '*.*=Thumbnail', thumbnailFitMode: 'ActualSize'}] }); u.writeHtml();
You may also get rotation angle value on the server and handle it in a way that suites your requirements, for more information, please, see the receiving rotation angle paragraph.
To disable manual image rotation set the Uploader.EnableRotation property to false
.
Automatic rotation means that ActiveX/Java Uploader rotates images automatically, if needed. The decision, whether to
rotate an image or not, is based on the EXIF metadata contained in the original image. To turn automatic rotation on you have to set the
Uploader.EnableAutoRotation property to true
and add a
Thumbnail converter, as it is shown in the following example.
<aur:Uploader ID="Uploader1" runat="server" EnableAutoRotation="true"> <Converters> <aur:Converter Mode="*.*=Thumbnail" ThumbnailFitMode="ActualSize" /> </Converters> </aur:Uploader>
$uploader = new Uploader("Uploader1"); $uploader->setEnableAutoRotation(true); $converters = &$uploader->getConverters(); $converter = new Converter(); $converter->setMode("*.*=Thumbnail"); $converter->setThumbnailFitMode("ActualSize"); $converters[] = $converter;
var u = $au.uploader({ id: 'Uploader1', enableAutoRotation: true, converters: [{mode: '*.*=Thumbnail', thumbnailFitMode: 'ActualSize'}] }); u.writeHtml();
Though it may be convenient, remember that not all the cameras recognize orientation properly. Reading EXIF data also slows down the process of folder scanning, and if the folder contains a lot of images, the decrease in speed may be noticeable.
This paragraph describes main approaches to cropping in ActiveX/Java Uploader:
This approach assumes that users can crop images in ActiveX/Java Uploader
by selecting a rectangular area of an image via the image editor. To add the crop functionality to the image editor
you should set the ImageEditor.EnableCrop property to true
.
The Converter.ThumbnailApplyCrop property indicates
if the image thumbnail should be cropped according to the user-selected rectangle;
this property makes sense only if a thumbnail converter is specified in uploader configuration.
A user can resize and move the selection rectangle, but you can impose limits on it. For example, you can specify the minimum width and height of the rectangle using the ImageEditor.CropMinSize property. The default value of this property is 50, which means that a user cannot make the selection rectangle smaller than 50x50.
Also you can set an aspect ratio for the selected rectangle using the ImageEditor.CropRatio property.
CropRatio defines the width-to-height proportion and accepts the following formats:
0.75
, 3:4
, 3/4
.
All these values specify the 3:4 aspect ratio of the cropping rectangle in the portrait orientation.
A user can change the portrait orientation to landscape and vice versa with ease,
but you can deny this by adding ; fixed
to the CropRatio value.
The following code snippet enables cropping images on the client side. The selection rectangle has the 3:4 ratio in the portrait orientation only, and the minimum width is 30:
<aur:Uploader ID="Uploader1" runat="server" > <Converters> <aur:Converter Mode="*.*=Thumbnail" ThumbnailFitMode="ActualSize" ThumbnailApplyCrop="true" /> </Converters> <ImageEditor CropRatio="3/4; fixed" EnableCrop="True" CropMinSize="30"/> </aur:Uploader>
$uploader = new Uploader("Uploader1"); $converters = &$uploader->getConverters(); $converter = new Converter(); $converter->setMode("*.*=Thumbnail"); $converter->setThumbnailFitMode("ActualSize"); $converter->setThumbnailApplyCrop(true); $converters[] = $converter; $uploader->getImageEditor()->setCropRatio("3/4; fixed"); $uploader->getImageEditor()->setEnableCrop(true); $uploader->getImageEditor()->setCropMinSize("30");
var u = $au.uploader({ id: 'Uploader1', converters: [{mode: '*.*=Thumbnail', thumbnailFitMode: 'ActualSize', thumbnailApplyCrop: true}], imageEditor: { enableCrop: true, cropMinSize: "30", cropRatio: "3/4; fixed"} }); u.writeHtml();
This paragraph describes how to crop each user-selected image automatically. Automatic cropping consists of two parts:
true
.Manual cropping does not work in automatic mode, i.e. if a user defines the crop rectangle in the image editor,
it will not affect an uploaded image. This may confuse users, thus we recommend that you disable the crop functionality
in the image editor by setting ImageEditor.EnableCrop to false
.
The following example crops 200 x 200 pixels rectangle out of the center of each user-selected image.
<script type="text/javascript"> function beforeUploadHandler(){ var cropWidth = 200; var cropHeight = 200; var count = $au.uploader('Uploader1').files().count(); for (var i=0; i < count; i++) { var $file = $au.uploader('Uploader1').files().get(i); var imageCenterX = $file.width() / 2; var imageCenterY = $file.height() / 2; var cropBounds = [(imageCenterX - cropWidth/2), (imageCenterY - cropHeight/2), cropWidth, cropHeight]; $file.cropBounds(cropBounds); } } </script> <aur:Uploader ID="Uploader1" runat="server" > <Converters> <aur:Converter Mode="*.*=Thumbnail" ThumbnailFitMode="ActualSize" ThumbnailApplyCrop="true" /> </Converters> <ClientEvents> <aur:ClientEvent EventName="BeforeUpload" HandlerName="beforeUploadHandler" /> </ClientEvents> <ImageEditor EnableCrop="False"/> </aur:Uploader>
<script type="text/javascript"> function beforeUploadHandler(){ var cropWidth = 200; var cropHeight = 200; var count = $au.uploader('Uploader1').files().count(); for (var i=0; i < count; i++) { var $file = $au.uploader('Uploader1').files().get(i); var imageCenterX = $file.width() / 2; var imageCenterY = $file.height() / 2; var cropBounds = [(imageCenterX - cropWidth/2), (imageCenterY - cropHeight/2), cropWidth, cropHeight]; $file.cropBounds(cropBounds); } } </script> <?php $uploader = new Uploader("Uploader1"); $converters = &$uploader->getConverters(); $converter = new Converter(); $converter->setMode("*.*=Thumbnail"); $converter->setThumbnailFitMode("ActualSize"); $converter->setThumbnailApplyCrop(true); $converters[] = $converter; $uploader->getImageEditor()->setEnableCrop(false); $uploader->getClientEvents()->setBeforeUpload("beforeUploadHandler"); $uploader->render(); ?>
function beforeUploadHandler(){ var cropWidth = 200; var cropHeight = 200; var count = this.files().count(); for (var i=0; i < count; i++) { var $file = this.files().get(i); var imageCenterX = $file.width() / 2; var imageCenterY = $file.height() / 2; var cropBounds = [(imageCenterX - cropWidth/2), (imageCenterY - cropHeight/2), cropWidth, cropHeight]; $file.cropBounds(cropBounds); } } var u = $au.uploader({ id: 'Uploader1', converters: [{mode: '*.*=Thumbnail', thumbnailFitMode: 'ActualSize', thumbnailApplyCrop: true}], imageEditor: { enableCrop: false }, events: { beforeUpload: beforeUploadHandler } }); u.writeHtml();
Selecting an image area to highlight a person or an object is a popular idea in social networking. In ActiveX/Java Uploader a user actually selects a rectangular area in an image while cropping the image. Boundaries of this rectangle will be uploaded along with the image, no matter what converter mode you use (in this case you can set SourceFile mode). So, on the server side you may receive a user designated selection and show the highlighted area on the image.
To get to know how to obtain crop bounds on the server side, please, see the receiving crop bounds paragraph.