Request Crop images

Bug #517082 reported by Engel Komies
32
This bug affects 4 people
Affects Status Importance Assigned to Milestone
Inkscape
Fix Released
Wishlist
jazzynico

Bug Description

Hello,

I've got a request for a new feature in the next Inkcape version. I really miss a crop-tool for imported images. Could this tool be found in a next version please? Would be very nice!

Regards,

E. Komies

Tags: bitmap
su_v (suv-lp)
tags: added: bitmap
Changed in inkscape:
importance: Undecided → Wishlist
Revision history for this message
su_v (suv-lp) wrote :

RFEs related to cropping bitmap images in Inkscape:

Bug #517082 “Request Crop images” (New)
Bug #479864 “image cutting tool like openoffice Draw” (New)
Bug #248199 “some image editing tools for webdesign” (Invalid)
Bug #172166 “PLEASE INKSCAPE ADD CROP” (Invalid)
Bug #171598 “Crop bitmaps” (Invalid)
Bug #171427 “Crop bitmaps” (Invalid)
Bug #171299 “adjust brightness, contrast and crop images in Inkscape” (Invalid)
Bug #170839 “crop image” (Invalid)
Bug #170514 “Inplace cropping of images” (Invalid)
Bug #170291 “Image Cropping” (Invalid)

I'm not sure if we can mark them all as duplicate (e.g. of 170291) because over the time
- features have been added and improved:
   clipping&masking, editing clippaths&masks, edit bitmap externally
- importing of bitmaps has changed (from <image> to 'as pattern' back to <image> iiuc)

@JazzyNico - what would you suggest?

Revision history for this message
jazzynico (jazzynico) wrote :

I've marked all the crop reports duplicate of #170291, except the newer ones.
Now that Inkscape has ImageMagick effects and that ImageMagick supports cropping, why not implementing a cropping extension (in Extensions>Bitmap)?.

jazzynico (jazzynico)
Changed in inkscape:
assignee: nobody → JazzyNico (jazzynico)
status: New → In Progress
Revision history for this message
jazzynico (jazzynico) wrote :

Here is a first try, using the bitmap extension system.
It crops a bitmap (or a selection of bitmaps) according to top, bottom, left and right values (in px).

The only drawback is that the bitmap is resized, but not its SVG element. Thus it works well if the height and width SVG attributes are not set. If they are, the image is cropped, but keeps its original size on canvas.

I see no way to resize the SVG element from the extension, except changing things in extension/internal/bitmap/imagemagick.cpp.

Revision history for this message
jazzynico (jazzynico) wrote :

Jon, any idea or comment?

Revision history for this message
jazzynico (jazzynico) wrote :

Oops, sorry Jon, I wanted to ask Ted...

Revision history for this message
Ted Gould (ted) wrote : Re: [Bug 517082] Re: Request Crop images

Yeah, it wasn't really designed for that. What you could do is overload
the effect() function. Do the SVG tweeking, and then call the super
class's effect() function to do the image manipulation.

Revision history for this message
jazzynico (jazzynico) wrote :

Thanks for the tip, Ted.

I've tried your suggestion, and I now have a new overloaded effect() function. The problem is that I need a Magick::Image to get the image size and it's Inkscape::XML::Node in order to tweak the height and size (which is not necessarily exactly the bitmap size, e.g. if the svg object is resized with the object handles). These elements are easily available from an ImageMagickDocCache, but I see no way to use or create one from the overloaded function.

An alternative solution consists in adding the node to the applyEffect function (could be interesting if we add other resizing effects), but it implies that we change all the existing bitmap extensions.

The solution may be obvious, but I'm not a C++ expert, and my last course is far in the past (I'm trying to understand Inkscape's code and learn C++ at the same time...).

Revision history for this message
Ted Gould (ted) wrote :

What I'd recommend is using a member variable on your class. So then
you just save the node until you need it. So something like this:

  MyClass::Effect
    -> Sets MyClass::Working Node
    -> Calls ImageMagic::Effect()
    -> Clears MyClass::Working Node
  ImageMagic::Effect
    -> Does IM magic.
    -> Calls MyClass::applyEffect()
    -> Cleans up IM stuff
  MyClass::applyEffect
    -> Uses MyClass::Working Node
    -> Adjusts bit map
    -> Adjusts node

Does that make sense?

Revision history for this message
jazzynico (jazzynico) wrote :

> Does that make sense?

Yes, thanks. But I wonder if we really need all that. All the bitmap work is done in Crop::applyEffect, and I could also scale the object directly in the ImageMagic::Effect loop. Here's what I've started to do (far from being finished...):

    // Image size before effect
    unsigned int cols_before = effectedImage.columns();
    unsigned int rows_before = effectedImage.rows();

    applyEffect(&effectedImage);

    float cols_ratio = (float)rows_before / effectedImage.columns();
    float rows_ratio = (float)cols_before / effectedImage.rows();

    // The effect changed the image size, let's change the SVG height and width
    if (cols_ratio != 1 and rows_ratio != 1) {
        printf("Image %i: height reduced by %f", i, rows_ratio);
        printf(", width reduced by %f\n", cols_ratio);

   /*
   // From transformation.cpp
   SPItem *item = SP_ITEM(l->data);
   Geom::Scale scale (0,0);
   double new_width = scaleX;
   if (fabs(new_width) < 1e-6) new_width = 1e-6;
   double new_height = scaleY;
   if (fabs(new_height) < 1e-6) new_height = 1e-6;
   scale = Geom::Scale(new_width / 100.0, new_height / 100.0);
   sp_item_scale_rel (item, scale);
   */

   }

Revision history for this message
jazzynico (jazzynico) wrote :

Now I have to find a way to use sp_item_scale_rel inside ImageMagick::Effect. I think it is safer than playing with the node attributes directly, since height and width are chars and we never know what we could find in it (value, value + unit?).
I've started to copy a part of transformation.cpp which is not far from what I'm looking for. But I need to investigate more and understand how sp_items and all the related stuff work first...

Revision history for this message
Ted Gould (ted) wrote :

On Wed, 2010-04-07 at 18:27 +0000, JazzyNico wrote:
> Yes, thanks. But I wonder if we really need all that. All the bitmap
> work is done in Crop::applyEffect, and I could also scale the object
> directly in the ImageMagic::Effect loop. Here's what I've started to do
> (far from being finished...):

Yeah, that works too. Always lots of choices in programming :)

Revision history for this message
jazzynico (jazzynico) wrote :

> Yeah, that works too. Always lots of choices in programming :)

Yes, but not always simple and elegant. I'm not in the hurry, I'll try to do both :)

jazzynico (jazzynico)
Changed in inkscape:
milestone: none → 0.49
Revision history for this message
jazzynico (jazzynico) wrote :

Back to this feature with a new patch.

I've added a postEffect method that can be called after the effect is applied. Its goal is to modify the item (an not the image) whenever it is needed (eg if the image element height and width needs to be modified).

Note: the crop dimensions are given in bitmap pixels and thus may differ from the canvas image dimension.

Please test and comment!

Revision history for this message
jazzynico (jazzynico) wrote :

Available in the trunk as of revision 10554.

Changed in inkscape:
status: In Progress → Fix Committed
jazzynico (jazzynico)
Changed in inkscape:
status: Fix Committed → Fix Released
Revision history for this message
bemyself (chxp-moon) wrote :

Does the solution solve the problem that true crop in Inkscape?

I havenot see something about this in tuturiol.

Anyway, A true crop function is much help to reduce pdf format size when mix with bitmap and vector pictures, as the wishlist https://bugs.launchpad.net/inkscape/+bug/1027567 shows.

Revision history for this message
Qantas94Heavy (qantas94heavy) wrote :

@bemyself: this is the Raster -> Crop extension I believe.

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Duplicates of this bug

Other bug subscribers

Related questions

Remote bug watches

Bug watches keep track of this bug in other bug trackers.