CIFilter guassianBlur und boxBlur verkleinern das Bild - wie vermeidet man die Größenänderung?

7

Ich mache eine Momentaufnahme des Inhalts von NSView , wende eine CIFilter an und lege das Ergebnis wieder in die Ansicht. Wenn CIFilter eine Form der Unschärfe ist, z. B. CIBoxBlur oder CIGuassianBlur , ist das gefilterte Ergebnis etwas kleiner als das Original. Da ich dies iterativ mache, wird das Ergebnis immer kleiner, was ich vermeiden möchte.

Das Problem bezieht sich hier , wenn auch in einem etwas anderen Kontext ( Quarz-Komponist). Apple FunHouse Demo-App wendet eine Guassian blur an, ohne dass das Bild schrumpft, aber ich habe noch nicht herausgefunden, wie diese App es macht (es scheint OpenGL zu verwenden, was ich nicht kenne).

Hier ist der relevante Teil des Codes (innerhalb einer NSView Unterklasse)

%Vor%

Wenn ich einen Farbänderungsfilter wie CISepiaTone versuche, bei dem keine Pixel verschoben werden, tritt das Schrumpfen nicht auf.

Ich frage mich, ob es eine schnelle Lösung gibt, die nicht in openGL eintaucht?

    
foundry 19.11.2012, 03:57
quelle

3 Antworten

14

Sie verkleinern das Bild nicht, sondern erweitern es (ich denke um 7 Pixel um alle Kanten herum) und die standardmäßige UIView-Skalierung in der Ansicht lässt es so aussehen, als wäre es geschrumpft.

Beschneide deinen CImage mit:

%Vor%

Dabei sind die ursprünglichen Grenzen Ihres NSView-Objekts, in das Sie gezeichnet haben, und "Maßstab" ist Ihr [UIScreen mainScreen] -Maßstab].

    
BBC_Z 16.12.2012, 04:11
quelle
13

Wahrscheinlich möchten Sie Ihr Bild klemmen, bevor Sie die Weichzeichnung verwenden:

%Vor%

Dann blenden Sie und dann auf den ursprünglichen Umfang zuschneiden. Sie erhalten auf diese Weise nicht transparente Kanten.

    
ccgus 29.03.2014 19:56
quelle
2

@ BBC_Z's Lösung ist richtig.

Obwohl ich es eleganter finde, nicht nach der Ansicht zu schneiden, sondern nach dem Bild.
Und Sie können die nutzlosen unscharfen Kanten wegschneiden:

%Vor%     
NSAddict 29.03.2014 09:39
quelle