hilfdirselbst.ch
Facebook Twitter gamper-media
« « 1 2 » »  
J.Puff p
Beiträge: 181
2. Dez 2013, 10:25
Beitrag #1 von 20
Bewertung:
(3808 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Bildabmessungen auslesen


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.
Top
 
X
Uwe Laubender S
Beiträge: 3991
2. Dez 2013, 12:30
Beitrag #2 von 20
Beitrag ID: #520379
Bewertung:
(3772 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Bildabmessungen auslesen


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
als Antwort auf: [#520376] Top
 
J.Puff p
Beiträge: 181
2. Dez 2013, 12:39
Beitrag #3 von 20
Beitrag ID: #520380
Bewertung:
(3763 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Bildabmessungen auslesen


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.
als Antwort auf: [#520379] Top
 
Martin Fischer  M  p
Beiträge: 11784
2. Dez 2013, 13:05
Beitrag #4 von 20
Beitrag ID: #520382
Bewertung:
(3740 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Bildabmessungen auslesen


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
als Antwort auf: [#520380]
(Dieser Beitrag wurde von Martin Fischer am 2. Dez 2013, 13:14 geändert)
Top
 
Uwe Laubender S
Beiträge: 3991
2. Dez 2013, 13:10
Beitrag #5 von 20
Beitrag ID: #520383
Bewertung:
(3735 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Bildabmessungen auslesen


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
als Antwort auf: [#520380] Top
 
J.Puff p
Beiträge: 181
2. Dez 2013, 13:11
Beitrag #6 von 20
Beitrag ID: #520384
Bewertung:
(3732 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Bildabmessungen auslesen


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.
als Antwort auf: [#520382] Top
 
Martin Fischer  M  p
Beiträge: 11784
2. Dez 2013, 13:19
Beitrag #7 von 20
Beitrag ID: #520385
Bewertung:
(3722 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Bildabmessungen auslesen


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
als Antwort auf: [#520384]
(Dieser Beitrag wurde von Martin Fischer am 2. Dez 2013, 13:25 geändert)
Top
 
Hans Haesler  M  p
Beiträge: 5557
2. Dez 2013, 13:19
Beitrag #8 von 20
Beitrag ID: #520386
Bewertung:
(3721 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Bildabmessungen auslesen


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
als Antwort auf: [#520384] Top
 
Uwe Laubender S
Beiträge: 3991
2. Dez 2013, 13:21
Beitrag #9 von 20
Beitrag ID: #520387
Bewertung:
(3714 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Bildabmessungen auslesen


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
als Antwort auf: [#520383] Top
 
J.Puff p
Beiträge: 181
2. Dez 2013, 13:22
Beitrag #10 von 20
Beitrag ID: #520388
Bewertung:
(3708 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Bildabmessungen auslesen


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

Beste Grüße
Johannes
als Antwort auf: [#520386] Top
 
Uwe Laubender S
Beiträge: 3991
2. Dez 2013, 13:24
Beitrag #11 von 20
Beitrag ID: #520390
Bewertung:
(3707 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Bildabmessungen auslesen


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
als Antwort auf: [#520386] Top
 
Hans Haesler  M  p
Beiträge: 5557
2. Dez 2013, 13:41
Beitrag #12 von 20
Beitrag ID: #520393
Bewertung:
(3673 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Bildabmessungen auslesen


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
als Antwort auf: [#520390]
(Dieser Beitrag wurde von Hans Haesler am 2. Dez 2013, 17:40 geändert)
Top
 
Uwe Laubender S
Beiträge: 3991
2. Dez 2013, 13:42
Beitrag #13 von 20
Beitrag ID: #520396
Bewertung:
(3670 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Bildabmessungen auslesen


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
als Antwort auf: [#520390] Top
 
Uwe Laubender S
Beiträge: 3991
2. Dez 2013, 13:44
Beitrag #14 von 20
Beitrag ID: #520397
Bewertung:
(3670 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Bildabmessungen auslesen


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
als Antwort auf: [#520393] Top
 
Hans Haesler  M  p
Beiträge: 5557
2. Dez 2013, 13:53
Beitrag #15 von 20
Beitrag ID: #520400
Bewertung:
(3652 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Bildabmessungen auslesen


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
als Antwort auf: [#520397] Top
 
« « 1 2 » »  
X