• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
0

Image swapping script scale issue question

Contributor ,
Jun 16, 2024 Jun 16, 2024

Copy link to clipboard

Copied

Hello 

 

I have a script below which I have been working on - it allows the user to select two things and swap the sizes. 

For example you need to swap the main image with a drop in image - this allows for the swap to happen with one shortcut.

The bad news is I am having a hard time getting the images inside frames to fit portionally once swapped  they still have the old sizing and do not adapt for the changing frame sizes. 

 

Any help on this would be great!

 

Many thanks 

 

Smyth

 

The samples below show the script before and after using coloured boxes and then a sample with phototos and the issue that arrises.

 

Before

SmythWharf_1-1718551559506.png

 

After 

SmythWharf_2-1718551578647.png

they have swaped placed 

 

 

and an example with photos below 

before

SmythWharf_3-1718551689539.png

after  - it looks like there is nothing there but it because the images have not fitted proportionality

SmythWharf_4-1718551708475.png

when I fit them myself i can see that they are there  - would be good if the script could also do this part so then the user only needs to adjust the crop to their liking 

SmythWharf_5-1718551758744.png

 

 

 

 

 

 

 

 

#target indesign

app.doScript(function() {
    if (app.selection.length !== 2) {
        alert("Please select exactly two objects.");
    } else {
        var firstObject = app.selection[0];
        var secondObject = app.selection[1];

        // Ensure both objects are valid
        if (!firstObject.isValid || !secondObject.isValid) {
            alert("Invalid selection. Please select two valid objects.");
        } else {
            // Get the geometric bounds of both objects
            var firstBounds = firstObject.geometricBounds;
            var secondBounds = secondObject.geometricBounds;

            // Swap the geometric bounds (sizes and positions)
            firstObject.geometricBounds = secondBounds;
            secondObject.geometricBounds = firstBounds;

            // Adjust images within the swapped rectangles
            adjustImage(firstObject);
            adjustImage(secondObject);
        }
    }
}, ScriptLanguage.JAVASCRIPT, null, UndoModes.ENTIRE_SCRIPT, "Swap Object Sizes and Positions");

function adjustImage(rect) {
    if (rect.constructor.name === "Rectangle" && rect.graphics.length > 0) {
        var graphic = rect.graphics[0];
        if (graphic && graphic.itemLink && graphic.itemLink.isValid) {
            // Get the new dimensions of the rectangle
            var rectWidth = rect.geometricBounds[3] - rect.geometricBounds[1];
            var rectHeight = rect.geometricBounds[2] - rect.geometricBounds[0];

            // Get the current dimensions of the image
            var imageWidth = graphic.itemLink.imageProxy.width;
            var imageHeight = graphic.itemLink.imageProxy.height;

            // Calculate the scaling ratios
            var ratioWidth = rectWidth / imageWidth;
            var ratioHeight = rectHeight / imageHeight;

            // Determine the scaling ratio to fit the image proportionally within the rectangle
            var scaleRatio = Math.min(ratioWidth, ratioHeight);

            // Resize the image proportionally
            graphic.horizontalScale = scaleRatio * 100;
            graphic.verticalScale = scaleRatio * 100;
        }
    }
}

 

 

 

TOPICS
Experiment , How to , Scripting , SDK

Views

229

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Participant ,
Jun 17, 2024 Jun 17, 2024

Copy link to clipboard

Copied

Hello,
First, you need to decide what is more important to you: the appearance of the image in the first frame or the characteristics of the second frame. Then set the properties.

my_graphic_frame.properties = {
		frameFittingOptions:{
			autoFit: ,
			fittingOnEmptyFrame: ,
			fittingAlignment: ,
			topCrop: ,
			bottomCrop: ,
			leftCrop: ,
			rightCrop:
		}
	}

SychevKA_0-1718615480632.png

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jun 17, 2024 Jun 17, 2024

Copy link to clipboard

Copied

Hi @SmythWharf , It might be easier to simply swap the links rather than deal the bounds. Something like this:

 

app.doScript(swapImages, ScriptLanguage.JAVASCRIPT, undefined, UndoModes.ENTIRE_SCRIPT, 'Swap Images');

function swapImages(){
    if (app.selection.length !== 2) {
        alert("Please select exactly two objects.");
    } else {
        var firstObject = app.selection[0];
        var secondObject = app.selection[1];
        if (!firstObject.isValid || !secondObject.isValid) {
            alert("Invalid selection. Please select two valid objects.");
        } else {
            var fp1 = firstObject.images[0].itemLink.filePath;
            var fp2 = secondObject.images[0].itemLink.filePath;
            firstObject.place(fp2);
            firstObject.fit(FitOptions.PROPORTIONALLY);
            secondObject.place(fp1);
            secondObject.fit(FitOptions.PROPORTIONALLY);
        }
    }
}

 

 

 

Screen Shot 6.png

 

Screen Shot 7.png

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Contributor ,
Jun 18, 2024 Jun 18, 2024

Copy link to clipboard

Copied

LATEST

Hello,

Thank you Rob for taking time to look into this. 

I had a go and you have lead me down a positive track. 

The most ideal script would be able to swap anything, from text boxes, images and groups which comprises of both. 

I have had a go at updating the script and have tried content aware fit option 

It seems to work, fingers crossed. 

Best, 

Smyth

 

 

#target indesign

app.doScript(function() {
    if (app.selection.length !== 2) {
        alert("Please select exactly two objects.");
    } else {
        var firstObject = app.selection[0];
        var secondObject = app.selection[1];

        // Ensure both objects are valid
        if (!firstObject.isValid || !secondObject.isValid) {
            alert("Invalid selection. Please select two valid objects.");
        } else {
            // Get the geometric bounds of both objects
            var firstBounds = firstObject.geometricBounds;
            var secondBounds = secondObject.geometricBounds;

            // Swap the geometric bounds (sizes and positions)
            firstObject.geometricBounds = secondBounds;
            secondObject.geometricBounds = firstBounds;

            // Function to fit the images using content-aware fit in the given object
            function contentAwareFitImages(object) {
                if (object.constructor.name === "Rectangle" && object.images.length > 0) {
                    object.fit(FitOptions.CONTENT_AWARE_FIT);
                } else if (object.constructor.name === "Group") {
                    for (var i = 0; i < object.allPageItems.length; i++) {
                        if (object.allPageItems[i].constructor.name === "Rectangle" && object.allPageItems[i].images.length > 0) {
                            object.allPageItems[i].fit(FitOptions.CONTENT_AWARE_FIT);
                        }
                    }
                }
            }

            // Apply content-aware fit to images in both objects
            contentAwareFitImages(firstObject);
            contentAwareFitImages(secondObject);
        }
    }
}, ScriptLanguage.JAVASCRIPT, null, UndoModes.ENTIRE_SCRIPT, "Swap Object Sizes and Positions");

 

 

 

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines