Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

All other Modules

Discuss all other Modules here.

Moderators: martimiz, Sean, biapar, Willr, Ingo, swaiba, simon_w

DataObjectManager - resize image at creation by input value


Go to End
Reply

11 Posts   3248 Views

Avatar
Allisone

25 April 2009 at 1:22am Community Member, 27 Posts

Is there a nice way to resize the image that I upload ?

I would like to use an input field (next to Name and describtion), where I can set the width, so that after the image got uploaded, and after I filled the image input fields (in the following dialog), it automatically gets resized to that width and saved as the main image (not thumbnail or so).

Thanks in advance.

Avatar
UncleCheese

25 April 2009 at 3:26am 4085 Posts

Of course.. let's say you put two properties on your ImageObject "ImageWidth" and "ImageHeight".. you could then write a function on the page containing that image:

function ResizedImage()
{
return $this->Image()->CroppedImage($this->ImageWidth, $this->ImageHeight);
}

and on your template:

<img src="$ResizedImage.URL" alt="" />

Avatar
Allisone

25 April 2009 at 6:04am Community Member, 27 Posts

If I understand you correctly, you are suggesting to always resize the image (on demand) when it is used somewhere... ?

I thought there would be a way to make this happen once, right after the image(/images) have been uploaded, in this multi-page dialog (Editing file 1 of X), that comes after pressing the upload button, or directly in the "Add Images"-dialog (before you click on the blue upload button)...

For now, I have written a function that lets me check from within the template if an uploaded image is wider than what I want. If so, I set a css width value, so that the browser can reduce the width. But since I exactly know, how big the width must be for all images that I upload ( < 700px ), it would make more sence to simply reduce the file size on uploading, wouldn't it... ?

For those who stumble across this post, wondering how I did it, here is my code...

   <% control ReferenzenBild.Bild %>         
            <% if isWiderThan(700) %>
               <img src="$URL" style="width: 740px" />
            <% else %>         
               <img src="$URL"/>   
            <% end_if %>                        
         <% end_control %>

ReferenzenBild is what you call 'Resource', // Source class in your ResourcePage
Bild is what you call 'Attachment' => 'File', in your Resource
Instead of File I use ImageExtended, a class that extends Image containing my isWiderThan function
With "your" I mean what I read in http://doc.silverstripe.com/doku.php?id=modules:dataobjectmanager

   public function isWiderThan($width = 740){
      return ($this->getWidth() > $width);
   }

By the way, it's so good, that you programmed this module, I was looking for something like that since my first contact with silverstripe (half a year).
Thank you :D !!!

Avatar
UncleCheese

25 April 2009 at 6:49am 4085 Posts

Thanks for the compliment! Glad it's working for you.

As a matter of best practice, Silverstripe does not resize on upload. The original image that you upload is always kept in tact. When you resize the image on the template, it duplicates the image and resamples it, so that it can retrieve it easily the next time. If that ever changes, it will cut a new version, but it will never alter the integrity of your original image.

Avatar
Allisone

25 April 2009 at 7:32am (Last edited: 25 April 2009 7:33am), Community Member, 27 Posts

I'm not quite sure I understand, do you mean it remembers my resizing (the return $this->Image()->CroppedImage($this->ImageWidth, $this->ImageHeight); ) so that next time or each next time he loads, he won't resize again, but take the image, that was resized the very first time, only ?
because I don't want him to resize each time... I know its quite fast, I programmed a Banner editor that does a really mega mega mega huge amount of work (and it's animated too) and all work is done in 1 second, but still if it's possible you never want to do the same work twice (or have the same operation twice).

Avatar
UncleCheese

25 April 2009 at 7:43am 4085 Posts

That's correct. It caches the resampled image in the _resampled folder and provided the dimensions never change on your template, it will never resize again. Once you make a change, however, the first time the page loads, it will cut a new image to the _resampled folder with the new dimensions.

Avatar
Allisone

25 April 2009 at 8:33am Community Member, 27 Posts

Thank you very very much for this imformation :D

Avatar
Howard

25 April 2009 at 9:39am Community Member, 215 Posts

Hi guys,

I realise that it is normal practice to not destroy the integrity of the source image but I am building a site at the moment that has a lot of admins all uploading photos from events and you just know that there will be those who upload the 3mb images directly off their camera. I'm not keen on having all that space used (hundreds of photos) on the server so is there a way to do what he is originally asking? ie. upload, if larger than x resize to 800x600 and save.

Go to Top