Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign Skriptwerkstatt » Bildabmessungen auslesen

Bildabmessungen auslesen

J.Puff
Beiträge gesamt: 238

2. Dez 2013, 10:25
Bewertung:

gelesen: 6745

Beitrag als Lesezeichen
Hallo,
ich möchte per Script die Größe eines Bildes in Pixel herausfinden. Dabei geht es um die Original-Größe des Bildes, also nicht um die Größe des Bild-Rahmens, auch nicht um die Skalierung oder um Auflösungen.

In der Verknüpfungspalette findet sich dieser Wert unter "Verknüpfungsinformationen : Abmessungen".

Aber wie bekomme ich diesen Wert per Script?

Danke für eine Tipp,
Johannes.

Bildabmessungen auslesen

Uwe Laubender
Beiträge gesamt: 5316

2. Dez 2013, 12:30
Bewertung:

gelesen: 6709

Beitrag als Lesezeichen
Hallo, Johannes!

Also einen direkten Weg, eine Property wie "image.meassurements" oder so gibt's ja nicht.

Du könntest:
1. Die Abmessungen über die geometricBounds und die effektive Auflösung errechnen.

2. Das Bild über BridgeTalk in PhotoShop öffnen und dort die Abmessungen auslesen:

2.1 Einheiten auf Pixel stellen
2.2 "height" und "width" des documents auslesen.

Einen anderen Weg sehe ich gerade nicht…
*****
Mit herzlichem Gruß,
Uwe Laubender

Bildabmessungen auslesen

J.Puff
Beiträge gesamt: 238

2. Dez 2013, 12:39
Bewertung:

gelesen: 6700

Beitrag als Lesezeichen
Hallo Uwe,
danke für die Ideen. Die sind gut, solange das Bild keinen Ausschnitt hat, dann müsste wirklich PhotoShop involviert werden ...
Schade, dass InDesign uns nicht die gleichen Informationen abrufen lässt, die es in der Verknüpfungspalette anzeigen kann.

Beste Grüße
J.

Bildabmessungen auslesen

Martin Fischer
  
Beiträge gesamt: 12783

2. Dez 2013, 13:05
Bewertung:

gelesen: 6677

Beitrag als Lesezeichen
Hallo Johannes,

vielleicht lässt es sich folgendermaßen errechnen:

Code
// gegeben ein ausgewählte Bild 
if (app.selection.length == 0 || app.selection[0].constructor.name != 'Image')
exit();

var img = app.selection[0];

var doc = app.documents.firstItem();

// aktuelle Maßeinheit
var v_unit = doc.viewPreferences.verticalMeasurementUnits;
var h_unit = doc.viewPreferences.horizontalMeasurementUnits;

// Höhe und Breite in aktueller Maßeinheit unter Abzug der Skalierung
var img_height = (img.geometricBounds[2] - img.geometricBounds[0]) * 100 / img.absoluteVerticalScale;
var img_width = (img.geometricBounds[3] - img.geometricBounds[1]) * 100 / img.absoluteHorizontalScale;

// Höhe und Breite in Pixel
var img_heigth_in_pixels = get_in_pixels (img_height, v_unit);
var img_width_in_pixels = get_in_pixels (img_width, h_unit);

// Ausgabe
var str = 'Ergebnis\n\naktuell (100 %):\n\t' +
'Höhe:\t' + img_height + ' ' + img_heigth_in_pixels.type + '\n\t' +
'Breite:\t' + img_width + ' ' + img_width_in_pixels.type + '\n\nin Pixel:\n\t' +
'Höhe:\t' + img_heigth_in_pixels.value + ' px \n\t' +
'Breite:\t' + img_width_in_pixels.value + ' px';
alert( str);


function get_in_pixels(curr_value, curr_unit)
{
var curr_unit_value = UnitValue (curr_value, curr_unit);
return {value: curr_unit_value.as ("PIXELS"), type: curr_unit_value.type};
}


Da müsste am Ende auch der in der Verknüpfungspalette angezeigte Wert rauskommen.

Bin mir aber nicht sicher, ob ich alle möglichen Faktoren, die auf die Berechnung eine Auswirkung haben können, berücksichtigt habe.

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 2. Dez 2013, 13:14 geändert)

Bildabmessungen auslesen

Uwe Laubender
Beiträge gesamt: 5316

2. Dez 2013, 13:10
Bewertung:

gelesen: 6672

Beitrag als Lesezeichen
Hallo, Johannes!

Was meinst Du mit "Ausschnitt"? Die "Abmessungen" ändern sich nicht, wenn das Bild nur teilweise im Container-Rahmen zu sehen ist.

Ach ja: die geometricBounds, da hatte ich natürlich an diejenigen des Bildes gedacht. Die auszulesen ist bei verzerrten (shear), gedrehten und skalierten Bildern eine kleine Herausforderung.

Muss aber kein Problem werden, denn Du könntest ja ein Duplikat des Bildes machen und die drei Eigenschaften rotationAngle, shearAngle sowie horizontalScale und verticalScale zurücksetzen.

Ausgehend von der Auswahl eines Bildrahmens geht das folgendermaßen:

Code
var myImage = app.selection[0].graphics[0]; 
var myImageDup = myImage.duplicate().clearTransformations();

*****
Mit herzlichem Gruß,
Uwe Laubender

Bildabmessungen auslesen

J.Puff
Beiträge gesamt: 238

2. Dez 2013, 13:11
Bewertung:

gelesen: 6669

Beitrag als Lesezeichen
Hallo Martin,
danke für Dein Script, ich werde es nachher testen.
Beim Überfliegen habe ich den Eindruck, dass es auch nicht die Bildausschnitte berücksichtigt, bzw. berücksichtigen kann - oder?

Beste Grüße
J.

Bildabmessungen auslesen

Martin Fischer
  
Beiträge gesamt: 12783

2. Dez 2013, 13:19
Bewertung:

gelesen: 6659

Beitrag als Lesezeichen
Hallo Johannes,

da habe ich wohl was überlesen bzw. was Falsches reininterpretiert.

Aus
Zitat Dabei geht es um die Original-Größe des Bildes


machte ich unter der Hand
Zitat Dabei geht es um die Original-Größe des Original-Bildes


Ich habe nicht berücksichtigt, dass es nur um den Ausschnitt geht.

Außerdem habe ich das Gefühl, der Code ist ein Overload: von hinten durch die Brust ins Herz geschossen.

Vergiss diese Übung. ;-)

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 2. Dez 2013, 13:25 geändert)

Bildabmessungen auslesen

Hans Haesler
  
Beiträge gesamt: 5826

2. Dez 2013, 13:19
Bewertung:

gelesen: 6658

Beitrag als Lesezeichen
Hallo Johannes,

mit folgendem Script bekommst Du die Werte, welche neben "Abmessungen" im Bedienfeld zu sehen sind.

Code
//Bildgroesse_in_Pixel.js 

// vorbeugenderweise das Anzeigen von Dialogen aktivieren
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;

// testen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Es ist kein Dokument offen.", "Achtung");
exit();
}

// die Auswahl speichern und prüfen
var curSel = app.selection;
if (curSel.length == 0) {
alert ("Es ist nichts ausgewählt.", "Achtung");
exit();
}

// das aktuelle Dokument
var curDoc = app.documents[0];

// Masseinheiten, Linealursprung und Nullpunkt speichern
hM = curDoc.viewPreferences.horizontalMeasurementUnits;
vM = curDoc.viewPreferences.verticalMeasurementUnits;

// Einstellungen ändern
curDoc.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.INCHES;
curDoc.viewPreferences.verticalMeasurementUnits = MeasurementUnits.INCHES;

var curObj = curSel[0];
// der Typ des Objekts
var curType = curObj.constructor.name;
// prüfen des Typs
if (curType == "Rectangle" || curType == "Oval" || curType == "Polygon") {
curImage = curObj.graphics[0];
}
else if (curType == "Image") {
curImage = curObj;
}

// die Dimensionen speichern
var gB = curImage.geometricBounds;

// die Skalierung
var hSca = curImage.horizontalScale;
var vSca = curImage.verticalScale;

// die Originalauflösung
var ppi = curImage.actualPpi;

// die Breite
var imgW = ((((gB[3]-gB[1]))/hSca)*100)*ppi[0];
// die Höhe
var imgH = ((((gB[2]-gB[0]))/vSca)*100)*ppi[0];

// Masseinheiten, Linealursprung und Nullpunkt zurücksetzen
curDoc.viewPreferences.horizontalMeasurementUnits = hM;
curDoc.viewPreferences.verticalMeasurementUnits = vM;

// das Ergebnis anzeigen
alert ("Abmessungen = " + imgW + " x " + imgH + " Pixel", " ");

Also die totale Oberfläche eines Bildes, ungeachtet einer eventuellen Maskierung.

Diese erste Version liefert nur ein korrektes Ergebnis, wenn Dreh- und Scherwinkel auf Null stehen.

Gruss, Hans

Bildabmessungen auslesen

Uwe Laubender
Beiträge gesamt: 5316

2. Dez 2013, 13:21
Bewertung:

gelesen: 6651

Beitrag als Lesezeichen
Sorry, der Schnipsel enthält noch etliche "Unschärfen" in der Variablenbenennung.

So sollte es gehen:

Code
var myImage = app.selection[0].graphics[0]; 
var myImageContainerOfDup = myImage.duplicate();
myImageContainerOfDup.clearTransformations();
var myImageDup = myImageContainerOfDup.graphics[0];

*****
Mit herzlichem Gruß,
Uwe Laubender

Bildabmessungen auslesen

J.Puff
Beiträge gesamt: 238

2. Dez 2013, 13:22
Bewertung:

gelesen: 6645

Beitrag als Lesezeichen
Hallo Hans,
wunderbar, vielen Dank, das war, was ich suchte!

Beste Grüße
Johannes

Bildabmessungen auslesen

Uwe Laubender
Beiträge gesamt: 5316

2. Dez 2013, 13:24
Bewertung:

gelesen: 6644

Beitrag als Lesezeichen
Hallo, Hans!

Mit meiner "Begradigung" über das Duplikat und Zurücksetzen mit der clearTransformations()-Methode sollte es klappen eine normierte Ausgangsbasis für Dein Script zu haben.
*****
Mit herzlichem Gruß,
Uwe Laubender

Bildabmessungen auslesen

Hans Haesler
  
Beiträge gesamt: 5826

2. Dez 2013, 13:41
Bewertung:

gelesen: 6610

Beitrag als Lesezeichen
Hallo Uwe!

ja, so klappt es.

Allerdings wird dann ein Bild auch dupliziert, wenn es gar nicht notwendig wäre.

Weiss aber auch nicht, ob das Drehen und Scheren auf Null und wieder zurück besser ist.

Wie dem auch sei, nochmals das Script, ergänzt mit den Duplizieren-Zeilen:

Code
//Bildgroesse_in_Pixel.js 

// vorbeugenderweise das Anzeigen von Dialogen aktivieren
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;

// testen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Es ist kein Dokument offen.", "Achtung");
exit();
}

// die Auswahl speichern und prüfen
var curSel = app.selection;
if (curSel.length == 0) {
alert ("Es ist nichts ausgewählt.", "Achtung");
exit();
}

// das aktuelle Dokument
var curDoc = app.documents[0];

var curObj = curSel[0];
// der Typ des Objekts
var curType = curObj.constructor.name;
// prüfen des Typs
if (curType == "Rectangle" || curType == "Oval" || curType == "Polygon") {
curImage = curObj.graphics[0];
}
else if (curType == "Image") {
curImage = curObj;
}
else {
alert ("Bitte ein Bild auswählen.", "Stop");
exit();
}

// das Bild kopieren und die Transformationen entfernen
try {
var curImageContainerOfDup = curImage.duplicate();
curImageContainerOfDup.clearTransformations();
var curImage = curImageContainerOfDup.graphics[0];
}
catch (e) {
alert ("Der Bildrahmen ist leer.", "Stop");
exit();
}

// Masseinheiten, Linealursprung und Nullpunkt speichern
hM = curDoc.viewPreferences.horizontalMeasurementUnits;
vM = curDoc.viewPreferences.verticalMeasurementUnits;

// Einstellungen ändern
curDoc.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.INCHES;
curDoc.viewPreferences.verticalMeasurementUnits = MeasurementUnits.INCHES;

// die Dimensionen speichern
var gB = curImage.geometricBounds;

// die Skalierung
var hSca = curImage.horizontalScale;
var vSca = curImage.verticalScale;

// die Originalauflösung
var ppi = curImage.actualPpi;

// die Breite
var imgW = ((((gB[3]-gB[1]))/hSca)*100)*ppi[0];
// die Höhe
var imgH = ((((gB[2]-gB[0]))/vSca)*100)*ppi[0];

// Masseinheiten, Linealursprung und Nullpunkt zurücksetzen
curDoc.viewPreferences.horizontalMeasurementUnits = hM;
curDoc.viewPreferences.verticalMeasurementUnits = vM;

// die Kopie entfernen
curImageContainerOfDup.remove();

// das Ergebnis anzeigen
alert ("Abmessungen = " + imgW + " x " + imgH + " Pixel", " ");

Gruss, Hans

(Dieser Beitrag wurde von Hans Haesler am 2. Dez 2013, 17:40 geändert)

Bildabmessungen auslesen

Uwe Laubender
Beiträge gesamt: 5316

2. Dez 2013, 13:42
Bewertung:

gelesen: 6607

Beitrag als Lesezeichen
Hallo, zusammen!

So funktioniert's auch mit gedrehten und geshearten Bildern:

Code
//Bildgroesse_in_Pixel.js 
//Leicht modifiziert: Uwe Laubender

// vorbeugenderweise das Anzeigen von Dialogen aktivieren
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;

// testen, ob ein Dokument geöffnet ist
if (app.documents.length == 0) {
alert ("Es ist kein Dokument offen.", "Achtung");
exit();
}

// die Auswahl speichern und prüfen
var curSel = app.selection;
if (curSel.length == 0) {
alert ("Es ist nichts ausgewählt.", "Achtung");
exit();
}

//Uwe Laubender
//Normalisieren:
var originalSelection = app.selection[0];
var myImage = originalSelection.graphics[0];
var myImageContainerOfDup = myImage.duplicate();
myImageContainerOfDup.clearTransformations();


// das aktuelle Dokument
var curDoc = app.documents[0];

// Masseinheiten, Linealursprung und Nullpunkt speichern
hM = curDoc.viewPreferences.horizontalMeasurementUnits;
vM = curDoc.viewPreferences.verticalMeasurementUnits;

// Einstellungen ändern
curDoc.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.INCHES;
curDoc.viewPreferences.verticalMeasurementUnits = MeasurementUnits.INCHES;

//~ var curObj = curSel[0];
//~ // der Typ des Objekts
//~ var curType = curObj.constructor.name;
//~ // prüfen des Typs
//~ if (curType == "Rectangle" || curType == "Oval" || curType == "Polygon") {
//~ curImage = curObj.graphics[0];
//~ }
//~ else if (curType == "Image") {
//~ curImage = curObj;
//~ }

var curImage = myImageContainerOfDup.graphics[0];

// die Dimensionen speichern
var gB = curImage.geometricBounds;

// die Skalierung
var hSca = curImage.horizontalScale;
var vSca = curImage.verticalScale;

// die Originalauflösung
var ppi = curImage.actualPpi;

// die Breite
var imgW = ((((gB[3]-gB[1]))/hSca)*100)*ppi[0];
// die Höhe
var imgH = ((((gB[2]-gB[0]))/vSca)*100)*ppi[0];

// Masseinheiten, Linealursprung und Nullpunkt zurücksetzen
curDoc.viewPreferences.horizontalMeasurementUnits = hM;
curDoc.viewPreferences.verticalMeasurementUnits = vM;

myImageContainerOfDup.remove();
app.select(originalSelection);

// das Ergebnis anzeigen
alert ("Abmessungen = " + imgW + " x " + imgH + " Pixel", " ");

*****
Mit herzlichem Gruß,
Uwe Laubender

Bildabmessungen auslesen

Uwe Laubender
Beiträge gesamt: 5316

2. Dez 2013, 13:44
Bewertung:

gelesen: 6607

Beitrag als Lesezeichen
Hallo, Hans!
Ja, da haben sich unsere beiden letzten Posts überschnitten.
Ich für meinen Teil entferne das Duplikat in den Aufräumarbeiten weiter unten.
*****
Mit herzlichem Gruß,
Uwe Laubender

Bildabmessungen auslesen

Hans Haesler
  
Beiträge gesamt: 5826

2. Dez 2013, 13:53
Bewertung:

gelesen: 6589

Beitrag als Lesezeichen
Hallo Uwe!

auch in meinem Vorschlag wird die Kopie kurz vor dem Anueigen des Ergebnisses entfernt.

Achtung: Wenn der Anwender den Bildrahmen-Inhalt ausgewählt hat, dann kommt mit Deiner Version eine Fehlermeldung.

Gruss, Hans

Bildabmessungen auslesen

Uwe Laubender
Beiträge gesamt: 5316

2. Dez 2013, 14:04
Bewertung:

gelesen: 1168

Beitrag als Lesezeichen
Hallo, Hans!

Korrekt. Das kann man noch verfeinern. Ebenso der Fall, dass die platzierte Grafik vom Typ her nicht "Image" entspricht, also EPS oder PDF und die Abmessungen in Pixeln nicht auslesbar sind.

Mein Zusatzcode war nur auf die Schnelle eingefügt, um die Fälle "Rotation" und "Shear" abzudecken…
*****
Mit herzlichem Gruß,
Uwe Laubender

Bildabmessungen auslesen

Hans Haesler
  
Beiträge gesamt: 5826

2. Dez 2013, 14:07
Bewertung:

gelesen: 1165

Beitrag als Lesezeichen
Hallo Johannes,

ich habe den Code im Beitrag #12 mit weiteren Prüfungen ergänzt, damit die Fehlermeldung klarer ist, wenn ein leerer Bildrahmen (oder etwas anderes) ausgewählt ist.

Gruss, Hans

Bildabmessungen auslesen

Uwe Laubender
Beiträge gesamt: 5316

2. Dez 2013, 14:09
Bewertung:

gelesen: 1162

Beitrag als Lesezeichen
Hab Dein Script mal mit 'nem platzierten EPS getestet.
Das läuft dann auf einen Fehler hinaus, der nicht abgefangen wird…

Also: EPS und PDF müssten noch als Fall abgedeckt werden.
*****
Mit herzlichem Gruß,
Uwe Laubender

Bildabmessungen auslesen

Hans Haesler
  
Beiträge gesamt: 5826

2. Dez 2013, 14:10
Bewertung:

gelesen: 1161

Beitrag als Lesezeichen
Hallo Uwe!

ja, mit PDF und so wird es eine Fehlermeldung absetzen.

Aber Johannes wird uns bestimmt durchgeben, ob entsprechende Prüfungen notwendig sind.

Gruss, Hans

Bildabmessungen auslesen

J.Puff
Beiträge gesamt: 238

2. Dez 2013, 15:12
Bewertung:

gelesen: 1108

Beitrag als Lesezeichen
Hallo Hans, hallo Uwe,
großartige Unterstützung! Vielen Dank.
So wie es jetzt ist komme ich prima damit klar!

Schönen Tag noch,
Johannes