Page 1 of 1

[Solved] Insert and Crop an Image in Writer

PostPosted: Wed Aug 16, 2017 7:27 pm
by dlittlejohn
I have a Libre Office Macro and I need to crop an image, but I have been unable to figure it out. Anyone have a tip how to do it?

Code: Select all   Expand viewCollapse view
dim noArgs()
dim emptyDocComponent as object
dim document as object
dim dispatcher as object
emptyDocComponent = StarDesktop.LoadComponentFromUrl("private:factory/swriter", "_blank", 0, noArgs())
frame = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dim args1(3) as new com.sun.star.beans.PropertyValue
args1(0).Name = "FileName"
args1(0).Value = "file://" & inputPath
args1(1).Name = "FilterName"
args1(1).Value = "<All formats>"
args1(2).Name = "AsLink"
args1(2).Value = false
args1(3).Name = "Style"
args1(3).Value = "Graphics"

dispatcher.executeDispatch(frame, ".uno:InsertGraphic", "", 0, args1())

selection = ThisComponent.CurrentSelection
If selection.ImplementationName <> "SwXTextGraphicObject" Then
   Exit Sub
End If

' this is what the macro recorder captured, but it was "rem" and non-functional
rem dispatcher.executeDispatch(document, ".uno:Crop", "", 0, Array())

Re: Insert and Crop an Image in Writer

PostPosted: Wed Aug 16, 2017 8:03 pm
by FJCC
Starting from the last functioning part of your code, I would write
Code: Select all   Expand viewCollapse view
selection = ThisComponent.CurrentSelection
If selection.ImplementationName <> "SwXTextGraphicObject" Then
   Exit Sub
End If
GrphCrop = selection.GraphicCrop
GrphCrop.TOP = 2500
GrphCrop.BOTTOM = 2500
GrphCrop.LEFT = 2500
GrphCrop.RIGHT = 2500
selection.GraphicCrop = GrphCrop

The units of the cropping seem to be 0.01 mm.

Re: Insert and Crop an Image in Writer

PostPosted: Wed Aug 16, 2017 8:39 pm
by dlittlejohn
Interesting, thanks! It works and is is removing parts of the image, but it is not preserving the aspect ratio or changing the image size.

Is there a way to keep the aspect ratio when croping with a macro?

Re: Insert and Crop an Image in Writer

PostPosted: Wed Aug 16, 2017 9:37 pm
by musikai
You have to compensate the cropped parts by changing the image size. I can't remember the exact code but you can find out quite a lot by investigating the code of my macro called pictool:
https://extensions.openoffice.org/en/pr ... er-pictool

Re: Insert and Crop an Image in Writer

PostPosted: Thu Aug 17, 2017 8:31 am
by hubert lambert
Hello,

dlittlejohn wrote:Is there a way to keep the aspect ratio when croping with a macro?

You may either, depending on your real need:

- add these two lines after FJCC's snippet:
Code: Select all   Expand viewCollapse view
selection.Height = selection.Height - (GrphCrop.Bottom + GrphCrop.Top)
selection.Width = selection.Width - (GrphCrop.Left + GrphCrop.Right)

- change the crop values with negative ones.

Re: Insert and Crop an Image in Writer

PostPosted: Fri Aug 25, 2017 8:46 pm
by dlittlejohn
Appreciate the help. For posterity here is what I came up with. I had a known picture size in pixels that needed to be cropped. Not sure if my calculation is entirely accurate, but it is working so far.

Code: Select all   Expand viewCollapse view
   dim noArgs()
   dim emptyDocComponent as object
   dim document as object
   dim dispatcher as object
   emptyDocComponent = StarDesktop.LoadComponentFromUrl("private:factory/swriter", "_blank", 0, noArgs())
   frame = ThisComponent.CurrentController.Frame
   dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
   
   dim args1(3) as new com.sun.star.beans.PropertyValue
   args1(0).Name = "FileName"
   args1(0).Value = "file://" & inputPath
   args1(1).Name = "FilterName"
   args1(1).Value = "<All formats>"
   args1(2).Name = "AsLink"
   args1(2).Value = false
   args1(3).Name = "Style"
   args1(3).Value = "Graphics"
   
   dispatcher.executeDispatch(frame, ".uno:InsertGraphic", "", 0, args1())
   
    selection = ThisComponent.CurrentSelection
    If selection.ImplementationName <> "SwXTextGraphicObject" Then
       Exit Sub
    End If

   ' size = (pixels / pixelsPerInch) * mm/in * scaling * actual graphic / displayed graphic
   imageWidth = (int(pixelWidth) / int(xPixelsPerInch)) * 25.4 * 110 * (selection.actualSize.Width / selection.Width)
   imageHeight = (int(pixelHeight) / int(yPixelsPerInch)) * 25.4 * 110 * (selection.actualSize.Height / selection.Height)
   
   GraphicCrop = selection.GraphicCrop
   GraphicCrop.Top = selection.actualSize.Height - imageHeight
   GraphicCrop.Bottom = 0
   GraphicCrop.Left = 0
   GraphicCrop.Right = selection.actualSize.Width - imageWidth
   selection.GraphicCrop = GraphicCrop