I am creating a form in which I need a Profile picture of the user and I want that the picture is in a circle or a ectangular form. By default the area of image should be bl
Insert Image tag separately with default image then read the URL while selecting image through input tag.
<img id="profile" src="default.png" alt="profile-image" />
function readURL(input) {
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = function (e) {
$('#profile').attr('src', e.target.result);
}
reader.readAsDataURL(input.files[0]);
}
}
$("#image").change(function(){
readURL(this);
//other uploading proccess [server side by ajax and form-data ]
});
Fiddle Link: https://jsfiddle.net/7ao1qxLe/1/
$("#profileImage").click(function(e) {
$("#imageUpload").click();
});
function fasterPreview( uploader ) {
if ( uploader.files && uploader.files[0] ){
$('#profileImage').attr('src',
window.URL.createObjectURL(uploader.files[0]) );
}
}
$("#imageUpload").change(function(){
fasterPreview( this );
});
#imageUpload
{
display: none;
}
#profileImage
{
cursor: pointer;
}
#profile-container {
width: 150px;
height: 150px;
overflow: hidden;
-webkit-border-radius: 50%;
-moz-border-radius: 50%;
-ms-border-radius: 50%;
-o-border-radius: 50%;
border-radius: 50%;
}
#profile-container img {
width: 150px;
height: 150px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="profile-container">
<image id="profileImage" src="http://lorempixel.com/100/100" />
</div>
<input id="imageUpload" type="file"
name="profile_photo" placeholder="Photo" required="" capture>
What you can do is to hide the input and just act as if it was clicked when the profile image is clicked:
$("#profileImage").click(function(e) {
$("#imageUpload").click();
});
#imageUpload
{
display: none;
}
#profileImage
{
cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<image id="profileImage" src="http://lorempixel.com/100/100" />
<input id="imageUpload" type="file"
name="profile_photo" placeholder="Photo" required="" capture>
You can also give the user a preview of the uploaded image:
function previewProfileImage( uploader ) {
//ensure a file was selected
if (uploader.files && uploader.files[0]) {
var imageFile = uploader.files[0];
var reader = new FileReader();
reader.onload = function (e) {
//set the image data as source
$('#profileImage').attr('src', e.target.result);
}
reader.readAsDataURL( imageFile );
}
}
$("#imageUpload").change(function(){
previewProfileImage( this );
});
Efficiency note: You can make it more efficient if you use createObjectURL
instead of reading data as URL.
function fasterPreview( uploader ) {
if ( uploader.files && uploader.files[0] ){
$('#profileImage').attr('src',
window.URL.createObjectURL(uploader.files[0]) );
}
}
As you can see here in MDN, the URL.createObjectUrl
will just generate the URL for the file instead of having to load it into the DOM, which is definitely preferable for large files.
To display the image cropped in a circle, you will need to give it an outer div
and apply border-radius
to it:
HTML:
<div id="profile-container">
<image id="profileImage" src="aDefaultImage.png" />
</div>
CSS:
#profile-container {
width: 150px;
height: 150px;
overflow: hidden;
-webkit-border-radius: 50%;
-moz-border-radius: 50%;
-ms-border-radius: 50%;
-o-border-radius: 50%;
border-radius: 50%;
}
This snippet puts together all three steps:
$("#profileImage").click(function(e) {
$("#imageUpload").click();
});
function fasterPreview( uploader ) {
if ( uploader.files && uploader.files[0] ){
$('#profileImage').attr('src',
window.URL.createObjectURL(uploader.files[0]) );
}
}
$("#imageUpload").change(function(){
fasterPreview( this );
});
#imageUpload
{
display: none;
}
#profileImage
{
cursor: pointer;
}
#profile-container {
width: 150px;
height: 150px;
overflow: hidden;
-webkit-border-radius: 50%;
-moz-border-radius: 50%;
-ms-border-radius: 50%;
-o-border-radius: 50%;
border-radius: 50%;
}
#profile-container img {
width: 150px;
height: 150px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="profile-container">
<image id="profileImage" src="http://lorempixel.com/100/100" />
</div>
<input id="imageUpload" type="file"
name="profile_photo" placeholder="Photo" required="" capture>
You can use the below code to apply this picture selector
<img id="idcardfront" src="images/UploadImgPlaceholder.png" data-type="editable" />
<script>
$("#idcardfront").each(function (i, e) {
var _inputFile = $('<input/>')
.attr('type', 'file')
.attr('hidden', 'hidden')
.attr('id', 'idCardFrontFile')
.attr('onchange', 'readImage()')
.attr('data-image-placeholder', e.id)
.attr('Class', 'hidden');
$(e.parentElement).append(_inputFile);
$(e).on("click", _inputFile, triggerClick);
});
</script>