Script-Erweiterung

JKS

FF-Team
Dabei seit
06.06.02
Beiträge
6.712
#1
Neue Beta enthält:
FF_RotateFile
FF_Scale
FF_HQScale

und eine Liste aller Funktionen in der Hilfe.
 

ralfeberle

FF-Team
Mitarbeiter
Dabei seit
10.07.02
Beiträge
11.289
Trophäen
10*15!4{*}1{!}
#2
Hallo!

Erweiterung wurde in 'FixFoto Skript-Grundlagen'-Posting eingearbeitet!

Gruß,

Ralf
 

JKS

FF-Team
Dabei seit
06.06.02
Beiträge
6.712
#3
neue Beta enthält:
FF_ImportExif()
FF_ExportExif()

Damit wird es möglich, Fremdprogramme zu verwenden und dennoch die Exif-Daten zu erhalten.
Ablauf:
Code:
name = FF_GetImageName(0)
call FF_LoadImage(name)
call FF_ExportExif("temp")
call FF_SaveImage("temp.bmp",0)
' externe Bearbeitung("temp.bmp")
call FF_LoadImage("temp.bmp")
call FF_ImportExif("temp")
call FF_SaveImage(name,0)
 

ralfeberle

FF-Team
Mitarbeiter
Dabei seit
10.07.02
Beiträge
11.289
Trophäen
10*15!4{*}1{!}
#4
Hallo!

Erweiterung wurde in 'FixFoto Skript-Grundlagen'-Posting eingearbeitet!

Gruß,

Ralf
 

JKS

FF-Team
Dabei seit
06.06.02
Beiträge
6.712
#5
neue Beta enthält:
FF_SetProgress(VT_I4 progress, VT_I4 range) zur Fortschrittsanzeige
FF_ErrorBreak(VT_BSTR message) zum Abbruch der Skriptverarbeitung
FF_Saturation(VT_R8 saturation) zum Einstellen der Sättigung

Bei Fehlern in den internen Funktionen wird das Skript nun mit entsprechender Meldung abgebrochen.
 

ralfeberle

FF-Team
Mitarbeiter
Dabei seit
10.07.02
Beiträge
11.289
Trophäen
10*15!4{*}1{!}
#6
Hallo!

Erweiterung wurde in 'FixFoto Skript-Grundlagen'-Posting eingearbeitet, selbige gemäß FF-Bedienungsanleitung erweitert und komplett überarbeitet.

Gruß,

Ralf
 

JKS

FF-Team
Dabei seit
06.06.02
Beiträge
6.712
#7
FF_SetArea() ermöglicht die Auswahl von Rechtecken, auf die sich die folgenden Bildbearbeitungen beschränken. Mögliche Anwendungen sind z.B. Rahmen.

Beispiel "Buttonize":

Code:
option explicit
dim i,j,f,imagecount,width,height,size
dim fso,path,dir,file,ext
set fso = CreateObject("Scripting.FileSystemObject")
size = InputBox("Breite des Rahmens")
imagecount = FF_GetImageCount
for i=0 to imagecount-1
 path = FF_GetImageName(i)
 FF_LoadImage path
 width = FF_GetImageWidth()
 height = FF_GetImageHeight()
 for j=0 to size-1
  f = ((size-1) - j) / (size-1) * 127
  FF_SetArea j,j,width-j*2,1
  FF_WhiteBalance f,f,f
  FF_SetArea j,j+1,1,height-j*2-1
  FF_WhiteBalance f,f,f
  f = -f
  FF_SetArea width-j-1,j+1,1,height-j*2-1
  FF_WhiteBalance f,f,f
  FF_SetArea j,height-j-1,width-j*2,1
  FF_WhiteBalance f,f,f
 next
 SplitPath path,dir,file,ext
 FF_SaveImage dir & "Button_" & file & ext,0
 FF_SetProgress i+1,imagecount
next

' liefert Verzeichnis mit abschliessendem Backslash,
' Dateinamen und Erweiterung mit einleitendem Punkt
sub SplitPath(path, byref dir, byref file, byref ext)
 dir = fso.GetParentFolderName(path) & "\"
 file = fso.GetBaseName(path)
 ext = "." & fso.GetExtensionName(path)
end sub
Beispiel "unscharfer Rahmen":

Code:
option explicit
dim i,j,f,imagecount,width,height,size
dim fso,path,dir,file,ext
set fso = CreateObject("Scripting.FileSystemObject")
size = InputBox("Breite des Rahmens")
imagecount = FF_GetImageCount
for i=0 to imagecount-1
 path = FF_GetImageName(i)
 FF_LoadImage path
 width = FF_GetImageWidth()
 height = FF_GetImageHeight()
 FF_SetArea 0,0,width,size
 FF_Blur 20
 FF_SetArea 0,height-size,width,size
 FF_Blur 20
 FF_SetArea 0,0,size,height
 FF_Blur 20
 FF_SetArea width-size,0,size,height
 FF_Blur 20

 FF_SetArea size,size,width-size*2,1
 FF_WhiteBalance -255,-255,-255
 FF_SetArea size,height-size,width-size*2,1
 FF_WhiteBalance -255,-255,-255
 FF_SetArea size,size,1,height-size*2
 FF_WhiteBalance -255,-255,-255
 FF_SetArea width-size,size,1,height-size*2
 FF_WhiteBalance -255,-255,-255
 
 SplitPath path,dir,file,ext
 FF_SaveImage dir & "Blur_" & file & ext,0
 FF_SetProgress i+1,imagecount
next

' liefert Verzeichnis mit abschliessendem Backslash,
' Dateinamen und Erweiterung mit einleitendem Punkt
sub SplitPath(path, byref dir, byref file, byref ext)
 dir = fso.GetParentFolderName(path) & "\"
 file = fso.GetBaseName(path)
 ext = "." & fso.GetExtensionName(path)
end sub
 

Walter-46

Mitglied
Dabei seit
08.10.06
Beiträge
1.744
Standort
Meppen
Trophäen
*****!!! {**!!!}
#8
AW: Script-Erweiterung

Hallo Joachim,

kann FF_SetArea zusammen mit FF_Putmask und FF_Killmask harmonieren, oder gibt es da was zu beachten? MDFL habe ich analysiert, dort werden die Bitmapmasken aber nicht verwendet soweit ich das sehe. Gibts noch andere Skript, bei denen alle Akteure mitspielen?

Putmask und auch Tonemask deaktiviere ich mit Killmask, SetArea will aber mit Parameter (0,0,0,0, 0, 255, 64) erstmal nicht den Dienst quittieren, wie ihm befohlen wurde. Vielleicht ist es mein Fehler, eine Antwort könnte mir das lange Suchen vielleicht ersparen.

Danke im voraus.

Walter
 

JKS

FF-Team
Dabei seit
06.06.02
Beiträge
6.712
#9
AW: Script-Erweiterung

Verstehe die Frage nicht.
 

W.P.

Mitglied
Dabei seit
16.10.02
Beiträge
5.099
Standort
Anzing BY
#10
AW: Script-Erweiterung

Hallo Joachim,

er will wissen, wie FF_SetArea zu deaktivieren ist, da es für bestimmte Funktionen wie eine Maske arbeitet.
Meiner Meinung nach so, dass der ganze Bereich wieder beschrieben werden kann; ohne es jetzt selbst auszuprobiert zu haben:
FF_SetArea(0, 0, FF_GetImageWidth(), FF_GetImageHeight(), False, 0, 0)
 

JKS

FF-Team
Dabei seit
06.06.02
Beiträge
6.712
#11
AW: Script-Erweiterung

FF_SetArea(0,0,0,0,0,0,0) ist identisch mit FF_KillMask().
 

Walter-46

Mitglied
Dabei seit
08.10.06
Beiträge
1.744
Standort
Meppen
Trophäen
*****!!! {**!!!}
#12
AW: Script-Erweiterung

Danke Euch beiden.
Dann liegt das Problem in meinem Code, denn nach FF_SetArea(0,0,0,0,false,255,64) bestand die Rechteckmaske weiter. Werde das mal mit FF_SetArea(0,0,0,0,0,0,0) testen.

VG
Walter
 

JKS

FF-Team
Dabei seit
06.06.02
Beiträge
6.712
#13
AW: Script-Erweiterung

Macht keinen Unterschied. Sowie das Rechteck leer ist, wird die Maske gelöscht.
 

Walter-46

Mitglied
Dabei seit
08.10.06
Beiträge
1.744
Standort
Meppen
Trophäen
*****!!! {**!!!}
#14
AW: Script-Erweiterung

Hallo,

Sorry, ich muß nochmal auf das Problem zurückkommen.

Bei diesem Bild möchte ich per Script den linken gelben Lichtkegel farblich ändern,
ohne dass andere Bildteile betroffen sind. Nach dieser Änderung sollen weitere
Bildbearbeitungsfunktionen möglich sein, und dafür muß die erforderliche Maske
wieder abschaltbar sein.



Dafür habe ich folgendes versucht:

Code:
//FFSubmenu=Optimieren
//FFName=setarea-test

var	pwidth=0,pheight=0,mix=0;
var text = "Diese Schrift stellt eine weitere Bearbeitung dar, die nach Beendigung der Maskierung über das gesamte Bild erfolgt. Featuring Mastermix V1.3 "

main();

function ModifyImage()
	{
	FF_PopImage(); FF_PushImage();
	FF_PushImage();
//	FF_SetArea(0,0,0,0,0,0,0); 			// wenn aktiv, dann wirkt die spätere Rechteckmaske nicht
	
/*******************************************************************************************************************
	
Im Moment stellt sich die Situation für mich wie folgt dar:


1. Wird SetArea aktiviert, funktioniert es wie gewollt, läßt sich aber nicht wieder abschalten mit (0,0,0,0,0,0,0)	
	
2. Wird irgendwo im Scriptverlauf mit SetArea(0.0.0.0.0.0.0) abgeschaltet, dann wirkt die Rechteckbegrenzung 
   nirgendwo im Script
   
3. Zum Abschalten Setarea auf die maximalen Bildkoordinaten setzen, anstatt auf 0,0,0,0 hilft auch nicht weiter
	
*******************************************************************************************************************/	
	
	FF_Killmask();			   			 	// ist nötig, sonst kommt der masken-masken-masken-Effekt
	FF_PushImage();                     	// ablegen für die weitere BEA nach Differenzmaskierung
	FF_SpectralSaturation(40,130,0)
	FF_Diff();	
	FF_Monochrome(0.25, 0.50, 0.25);
	FF_Autocontrast()

    FF_SetArea(85,50,300,310,0,255,20); 	
	
	FF_Blur(20)
	FF_PutMask();
	FF_PopImage();   	                   	// nach Maskenerstellung Original zurück holen

  	FF_WhiteBalance(-255,-255,255)  		// diese Funktion verändert die die Farbe im maskierten Bereich
	FF_Killmask();	
	
	//FF_SetArea(0,0,0,0,0,0,0);   			// wenn aktiv, dann wirkt die Rechteckmaske nicht
								   			// wenn deaktiv, dann wirkt die Rechteckmaske dauerhaft
											// die Rechteckbegrenzung sollte hier abgeschaltet werden, was mir nicht gelingen will
	
	//FF_SetArea(0,0,800,540,0,255,0)		// auch das funktioniert leider nicht 

	weiterebearbeitungsfunktionen()  		//hier darf weder die Farbmaske noch die Rechteckmaske wirken

	FF_MixImage(0,0,FF_GetImageWidth(),FF_GetImageHeight(),mix*256/255);
	FF_PopImage();
	}

function OnOK()
	{
	FF_PopImage(); ModifyImage(); FF_Reload();
	}

function OnCancel() {return true;}

function OnTimer()
	{
	if(0 == pwidth)
		{
		pwidth = FF_GetControlWidth("DLG","PV");
		pheight = FF_GetControlHeight("DLG","PV");
		//FF_HQScale(pwidth,pheight,true); FF_PushImage();//deaktiviert weil kleines Bild
		FF_SetControl("DLG","PV","0");
		}
	imix = FF_GetControl("DLG","SL");
	if(imix != mix)
		{
		mix = imix;
		ModifyImage(); FF_SetControl("DLG","PV","0");
		}
	}

function main()
	{
	if(0 == FF_GetImageWidth()) {FF_MessageBox("Kein Bild geladen",0); return;}
	//** Start Dialog DLG **
	FF_AddDialog("DLG",475,353);
	FF_AddControl("DLG","PV","IMAGE",0,0,435,351);
	FF_AddControl("DLG","SL","VSLIDER",436,0,23,353);
	FF_AddControl("DLG","OK","BUTTON",460,250,15,100);
	FF_SetControl("DLG","SL",255);
	//** End Dialog DLG **
	FF_PushImage();
	FF_SetDialogTimer("DLG",100);
	for(;;)
		{
		ret = FF_ShowDialog("DLG");
		if(ret == "CANCEL") break;
		if(ret == "TIMER") OnTimer();
		if(ret == "OK") {OnOK(); break;}
		}
	FF_CloseDialog("DLG");
	}

function weiterebearbeitungsfunktionen()
	{
FF_DrawText( text , 130, 0, 50, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 80, 50, 40, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 50, 100, 30, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 30, 150, 20, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 15, 200, 15, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 5, 250, 10, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 15, 300, 15, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 30, 350, 20, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 50, 400, 30, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 80, 450, 40, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 130, 500, 50, 0, 400, 0, 0,10 , 3874544);	
	}

.....wie man sieht: Ohne Erfolg. Die Rechteckmaske läßt sich (von mir) nicht wieder
abschalten. Vielleicht weiß jemand Rat, oder ich habe die Funktion generell falsch
verstanden.

Mit folgendem Code funktioniert als Ausweichlösung alles wie gewünscht, aber dabei
muß ich leider auf die schöne Weichzeichnung des Maskenrandes beim SetArea-Befehl
verzichten, und die Anwendung ist unkomfortabler:

Code:
//FFSubmenu=Optimieren
//FFName=areafillrect-test

var	pwidth=0,pheight=0,mix=0;
var text = "Diese Schrift stellt eine weitere Bearbeitung dar, die nach Beendigung der Maskierung über das gesamte Bild erfolgt. Featuring Mastermix V1.3 "

main();

function ModifyImage()
	{
	FF_PopImage(); FF_PushImage();
	FF_PushImage();
//	FF_SetArea(0,0,0,0,0,0,0); 			// wenn aktiv, dann wirkt die Rechteckmaske nicht
	
/********************************************************************************************************************************************
	
Diese Version maskiert mit FF_AreaFillRect alles UM DEN RECHTECKBEREICH HERUM. Das wäre ein Workaround, um das Problem mit FF_SetArea zu umgehen
	
********************************************************************************************************************************************/	
	
	FF_Killmask();			   			 	// ist nötig, sonst kommt der masken-masken-masken-Effekt
	FF_PushImage();                     	// ablegen für die weitere BEA nach Differenzermittlung
	FF_SpectralSaturation(40,130,0)
	FF_Diff();	
	FF_Monochrome(0.25, 0.50, 0.25);
	FF_Autocontrast()
	FF_AreaFillRect(0,0,800,50,255);  		// Streifen komplett oberhalb des Rechtecks
	FF_AreaFillRect(0,311,800,540,255); 	// dto. unterhalb
	FF_AreaFillRect(0,51,84,310,255);		// genau links vom Rechteck
	FF_AreaFillRect(311,51,800,310,255);	// genau rechts vom Rechteck
											// alles außerhalb des Rechteckes wird damit maskiert

	FF_WhiteBalance(-255,-255,-255)			// hier braucht areafillrect diesen befehl - sonst passiert nix
											// zum Verständnis: Offensichtlich ist dieser Befehl immer mit -255 -255 -255 zu besetzen, damit wird
											// wohl einfach nur die Veränderung in dem maskieren Bereich definiert. Diese Anweisung muß immer
											// hier stehen, damit die Maske wirkt. Ich verstehe das zwar nicht, aber das ist nicht so wichtig.
											// Mit den anderen Werten wird außerhalb des Rechtecks das Bild verändert - ungewollt und unkontrolliert,
											// Nutzung anderer Werte ist somit nach vorläufiger Erkenntnis unsinnig.
											
	FF_Blur(20)
	FF_PutMask();
	FF_PopImage();   	                   	// nach Maskenerstellung Original zurück holen
  	
  	FF_WhiteBalance(-255,-255,255)  		// diese Funktion bestimmt die die Farbe des zu verändernden Bereiches = RICHTIG
	FF_Killmask();	
	
	weiterebearbeitungsfunktionen()  		//hier darf weder die Farbmaske noch die Rechteckmaske wirken

	FF_MixImage(0,0,FF_GetImageWidth(),FF_GetImageHeight(),mix*256/255);
	FF_PopImage();
	}



function OnOK()
	{
	FF_PopImage(); ModifyImage(); FF_Reload();
	}

function OnCancel() {return true;}

function OnTimer()
	{
	if(0 == pwidth)
		{
		pwidth = FF_GetControlWidth("DLG","PV");
		pheight = FF_GetControlHeight("DLG","PV");
		//FF_HQScale(pwidth,pheight,true); FF_PushImage();
		FF_SetControl("DLG","PV","0");
		}
	imix = FF_GetControl("DLG","SL");
	if(imix != mix)
		{
		mix = imix;
		ModifyImage(); FF_SetControl("DLG","PV","0");
		}
	}

function main()
	{
	if(0 == FF_GetImageWidth()) {FF_MessageBox("Kein Bild geladen",0); return;}
	//** Start Dialog DLG **
	FF_AddDialog("DLG",475,353);
	FF_AddControl("DLG","PV","IMAGE",0,0,435,351);
	FF_AddControl("DLG","SL","VSLIDER",436,0,23,353);
	FF_AddControl("DLG","OK","BUTTON",460,250,15,100);
	FF_SetControl("DLG","SL",255);
	//** End Dialog DLG **
	FF_PushImage();
	FF_SetDialogTimer("DLG",100);
	for(;;)
		{
		ret = FF_ShowDialog("DLG");
		if(ret == "CANCEL") break;
		if(ret == "TIMER") OnTimer();
		if(ret == "OK") {OnOK(); break;}
		}
	FF_CloseDialog("DLG");
	}

function weiterebearbeitungsfunktionen()
	{
FF_DrawText( text , 130, 0, 50, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 80, 50, 40, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 50, 100, 30, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 30, 150, 20, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 15, 200, 15, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 5, 250, 10, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 15, 300, 15, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 30, 350, 20, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 50, 400, 30, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 80, 450, 40, 0, 400, 0, 0,10 , 3874544);	
FF_DrawText( text , 130, 500, 50, 0, 400, 0, 0,10 , 3874544);	
	}
Über Rückmeldungen würde ich mich freuen.

VG
Walter
 

JKS

FF-Team
Dabei seit
06.06.02
Beiträge
6.712
#15
AW: Script-Erweiterung

Die Rechteckmaske kann nicht einzeln deaktiviert werden. Sie ist kein Vektorobjekt, sondern wird direkt in die Maske gezeichnet.
 
Oben