iOS Swift - 草图样式swift 3中的高斯模糊效果

时间:2017-07-24 11:39:37

标签: ios swift blur sketchapp

我是Swift的新手。我使用高斯模糊效果在Sketch中创建了模糊的UI:

enter image description here

现在我想在UIImageView中实现这个效果。

可以使用模糊或CIFilter的视觉效果来达到同样的效果吗? (我已经尝试但没有得到它。可能是我错过了什么)

更新

好的..请到@firstinq。我打开了他的link并意识到我正在使用kCIInputRadiusKey而不是inputRadius。现在我在模拟器中取得了成功,但在真正的iOS设备中,它仍然是混乱的。

以下是模拟器(iPhone SE)中的屏幕截图:

enter image description here

但在真实的iOS设备(iPhone SE)中:

enter image description here

以下是模糊图片的代码:

    public Form1()
    {
        InitializeComponent();
    }

    string[,] Quest = new string[10, 4];
    string[,] Ans = new string[10, 2]; // in this array error was raising

    int i = -1;
    private void Form1_Load(object sender, EventArgs e)
    {
        Quest[0, 0] = "Which one of these stores more data than a DVD ?  ";
        Quest[0, 1] = "CD Rom ";
        Quest[0, 2] = "Floppy";
        Quest[0, 3] = "Blue Ray Disk  ";
        Quest[1, 0] = "Eight Bits make up a ";
        Quest[1, 1] = "byte ";
        Quest[1, 2] = "megabyte";
        Quest[1, 3] = "kilobyte  ";
        Quest[2, 0] = "The printed output from a computer is called  ";
        Quest[2, 1] = "Copy  ";
        Quest[2, 2] = "Soft Copy ";
        Quest[2, 3] = "Hard Copy  ";
        Quest[3, 0] = "Which one of these also known as read/write memory ?  ";
        Quest[3, 1] = "ROM";
        Quest[3, 2] = "RAM";
        Quest[3, 3] = "DVD  ";
        Quest[4, 0] = "To apply center alignment to a paragraph we can press  ";
        Quest[4, 1] = "Ctrl + S ";
        Quest[4, 2] = "Ctrl + C ";
        Quest[4, 3] = "Ctrl + E ";
        Quest[5, 0] = "We can insert a page number at  ";
        Quest[5, 1] = "Header ";
        Quest[5, 2] = "Footer ";
        Quest[5, 3] = "Both A and B ";
        Quest[6, 0] = "Which one can be used as watermark in a word document";
        Quest[6, 1] = "Text";
        Quest[6, 2] = "Image";
        Quest[6, 3] = "Both A and B ";
        Quest[7, 0] = "HTML is used to create ";
        Quest[7, 1] = "machine language program ";
        Quest[7, 2] = "high level program ";
        Quest[7, 3] = "web page ";
        Quest[8, 0] = "The computer jargon - WWWW, stands for : ";
        Quest[8, 1] = "World Wide Web Worm ";
        Quest[8, 2] = "World Wide Wildlife Web ";
        Quest[8, 3] = "World Wide Women's Week";
        Quest[9, 0] = "Which one of the following is not a search engine?  ";
        Quest[9, 1] = "Bing ";
        Quest[9, 2] = "Google ";
        Quest[9, 3] = "Windows";
        Ans[0, 0] = "Blue Ray Disk  ";
        Ans[1, 0] = "byte ";
        Ans[2, 0] = "Hard Copy  ";
        Ans[3, 0] = "RAM";
        Ans[4, 0] = "Ctrl + E ";
        Ans[5, 0] = "Both A and B ";
        Ans[6, 0] = "Both A and B ";
        Ans[7, 0] = "web page ";
        Ans[8, 0] = "World Wide Web Worm ";
        Ans[9, 0] = "Windows";
        timer1.Enabled = true;
        button1.Enabled = false;

    }

    private void timer1_Tick_1(object sender, EventArgs e)
    {
        i = i + 1;
        if (i == 9)
        {
            timer1.Enabled = false;
            button1.Enabled = true;
        }
        else
        {
            radioButton1.Checked = false;
            radioButton2.Checked = false;
            radioButton3.Checked = false;
            textBox1.Text = Quest[i, 0];
            radioButton1.Text = Quest[i, 1];
            radioButton2.Text = Quest[i, 2];
            radioButton3.Text = Quest[i, 3];
         }
    }

    private void radioButton1_CheckedChanged_1(object sender, EventArgs e)
    {
        Ans[i, 1] = radioButton1.Text;
    }

    private void radioButton2_CheckedChanged_1(object sender, EventArgs e)
    {
        Ans[i, 1] = radioButton2.Text;
    }

    private void radioButton3_CheckedChanged_1(object sender, EventArgs e)
    {
        Ans[i, 1] = radioButton3.Text;
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
        int j;
        int count = 0;
        for (j = 0; j < 9; j++)
        {
            if (Ans[j, 0] == Ans[j, 1])
                count += 1;
        }

        MessageBox.Show("You have shocred" + count + " marks");
    }
}

我在collectionView项目中使用了两个图像。一个图像模糊,在它上面,另一个图像是完全可见的。模糊图像尺寸为125x125(高斯模糊将减小此尺寸)。和 可见图像尺寸为50x50。两个图像都有圆角半径,使它们成圆形。

1 个答案:

答案 0 :(得分:1)

我不知道这是不是你想要的,但高斯模糊实际上需要整个图像来制作一个新图像。鉴于此,我假设您只想要imageView的内容视图中的裁剪图像。 因此,首先您必须使用以下方法捕获视图中的图像:(我建议使用UIView的扩展名)

public static func image(from view: UIView) -> UIImage? {
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
    defer { UIGraphicsEndImageContext() }
    if let context = UIGraphicsGetCurrentContext() {
        view.layer.render(in: context)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        return image
    }
    return nil
}

所以,现在你有了想要的图像,这次我们应该高斯模糊它: (再次,我更喜欢使用扩展,但这次是UIImage)

func getImageWithBlur() -> UIImage?{
    let context = CIContext(options: nil)

    guard let currentFilter = CIFilter(name: "CIGaussianBlur") else {
        return nil
    }
    let beginImage = CIImage(image: self)
    currentFilter.setValue(beginImage, forKey: kCIInputImageKey)
    currentFilter.setValue(6.5, forKey: "inputRadius")
    guard let output = currentFilter.outputImage, let cgimg = context.createCGImage(output, from: output.extent) else {
        return nil
    }
    return UIImage(cgImage: cgimg)
}

然后你可以使用比前面的UIImageView更小的zPosition设置另一个UIImageView,并且前面的UIImageView有更多的比例。

我也遇到了这个问题,并且我能够正确地获得此效果,但是打印方法太昂贵了,它会减慢您在集合/表格视图中的滚动速度。所以我无法在我的项目中使用它,但随意尝试在你的项目中使用它!