首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在UIImage的不透明像素周围绘制边框(笔划)

在UIImage的不透明像素周围绘制边框(笔划)可以通过以下步骤实现:

  1. 首先,将UIImage转换为CGImage对象,以便进行像素级别的操作。
  2. 创建一个临时的图像上下文,大小与原始图像相同。
  3. 将原始图像绘制到临时上下文中。
  4. 遍历临时上下文的每个像素,并检查其透明度。
  5. 如果像素的透明度大于0,则说明该像素在边界上。你可以通过检查其相邻像素的透明度来确定是否绘制边框。如果相邻像素的透明度为0,则说明该像素在不透明区域的边缘。
  6. 根据需要的边框宽度和颜色,在临时上下文中绘制边框。可以使用Core Graphics的绘图函数或者UIKit提供的绘制方法来完成。
  7. 创建一个新的UIImage对象,将临时上下文中的图像提取出来。

以下是一个示例代码,展示了如何实现在UIImage的不透明像素周围绘制边框:

代码语言:txt
复制
import UIKit

func addBorderToImage(image: UIImage, borderWidth: CGFloat, borderColor: UIColor) -> UIImage? {
    guard let cgImage = image.cgImage else {
        return nil
    }
    
    let width = cgImage.width
    let height = cgImage.height
    
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
    
    guard let context = CGContext(data: nil,
                                  width: width,
                                  height: height,
                                  bitsPerComponent: 8,
                                  bytesPerRow: width * 4,
                                  space: colorSpace,
                                  bitmapInfo: bitmapInfo.rawValue) else {
        return nil
    }
    
    context.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height))
    
    let data = context.data
    
    if let dataPointer = data?.assumingMemoryBound(to: UInt8.self) {
        for y in 0..<height {
            for x in 0..<width {
                let offset = 4 * (x + y * width)
                
                let alpha = CGFloat(dataPointer[offset + 3]) / 255.0
                
                if alpha > 0 && (x == 0 || y == 0 || x == width - 1 || y == height - 1 ||
                    dataPointer[offset - 4] == 0 || dataPointer[offset + 4] == 0 ||
                    dataPointer[offset - width * 4] == 0 || dataPointer[offset + width * 4] == 0) {
                    
                    // Draw border
                    dataPointer[offset] = UInt8(borderColor.redComponent * 255)
                    dataPointer[offset + 1] = UInt8(borderColor.greenComponent * 255)
                    dataPointer[offset + 2] = UInt8(borderColor.blueComponent * 255)
                }
            }
        }
    }
    
    guard let newCGImage = context.makeImage() else {
        return nil
    }
    
    let newImage = UIImage(cgImage: newCGImage)
    return newImage
}

// 使用示例
let originalImage = UIImage(named: "original_image.png")
let borderedImage = addBorderToImage(image: originalImage, borderWidth: 2.0, borderColor: UIColor.red)

请注意,上述代码仅实现了在不透明像素周围绘制边框的功能,并未涉及腾讯云的相关产品。如果你想了解腾讯云的云计算产品和服务,建议访问腾讯云的官方网站或咨询他们的客户支持团队,以获取更详细的信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

图层树和寄宿图 -- iOS Core Animation 系列一

如果contentsScale设置为1.0,将会以每个点1个像素绘制图片,如果2.0,则以每个点2个像素绘制图片(这就是Retina屏)。...如图所示,图片会变的有点大,而且有像素的颗粒感。因为CGImage和UIImage不一样,它没有拉伸的感念。用UIImage读取图片时,读取了高质量的Retina图片。...假设我们增加原点的值,并减小尺寸的值,例如将它变为{0.25, 0.25, 0.5, 0.5}将会在寄宿图周围留出一个边框。如下图: ? 上图是借用原书的图。...这效果看起来和UIImage里的resizableImageWithCapInsets:非常类似,它可以运用到任何寄宿图,包括在Core Graphics运行时绘制的图形。 ?...这个寄宿图的像素尺寸等于视图大小乘以contentsScale。

1.2K20
  • Swift-图像的性能优化

    Images(拉伸图像->检测图片有没有被拉伸) 会高亮那些被缩放或者拉伸以及没有正确对齐到像素边界的图片(也就是非整型坐标) 通常都会导致图片的不正常缩放,比如把一张大图当缩略图显示,或者不正确的模糊图像...: UIImage, size: CGSize) -> UIImage?...)但是由于是不透明的模式,所以看不到下面的颜色,默认看到了黑色的背景。...给图像添加边框,绘制内切的圆形 UIColor.darkGray.setStroke() path.lineWidth = 5 // 默认是'1' path.stroke() 判断一个应用程序的好坏...直接UIBezierPath(rect: rect)实例化了一个矩形的路径,然后在路径内绘图。但是突然想到不用裁切,不用设置圆形头像的边框,突然感觉这样就有点多此一举了,因此将多余的代码就都删除了。

    1.7K70

    【愚公系列】2023年11月 WPF控件专题 Ellipse控件详解

    原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见的标准用户界面元素。...,设置了控件的宽度和高度为50,并设置了填充颜色和边框颜色以及边框宽度。...Stroke属性:用于设置Ellipse的边框颜色。StrokeThickness属性:用于设置Ellipse的边框宽度。Opacity属性:用于设置Ellipse的不透明度。...绘制视觉效果,例如在创建鼠标悬停或按下效果时,可以在控件周围绘制一个圆形或椭圆形的边框,并在其中添加阴影或颜色变化等效果。...该控件具有100像素的宽度和高度,填充颜色为蓝色,描边为红色,并有一个2像素的描边线条厚度。您可以根据需要更改这些属性。我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

    80711

    Metal入门教程(八)Metal与OpenGL ES交互

    前面的教程介绍了Metal的图片绘制、三维变换、视频渲染、天空盒,用计算管道实现灰度计算和sobel边界检测,这次探究Metal与OpenGL ES的交互。...返回图像 * * @param pixelBufferRef 像素缓存引用 * * @return UIImage对象 */ - (UIImage *)lyGetImageFromPixelBuffer...但是实际的效果如下: ? Metal与OpenGL OpenGL ES渲染的图片不透明!...但这个并不是问题所在,因为这里只决定三角形区域内的像素点颜色,黑色部分为背景,并不受shader的影响。 通过上面的猜测,发现问题可能在glClearColor设置了不透明的颜色。...CAEAGLLayer的不透明属性设置为YES,有利于性能的优化,但是在demo里是会造成额外的影响! 通过把opaque属性设置成NO,问题终于解决。

    2.6K10

    iOS-OpenCV之蔡徐坤教你玩转边框画

    这篇文章就不会重复了,如果不是很清楚的读者可以看看第一篇文章。 这篇文章说是素描,其实与广义素描差距很大,准确的说应该是叫边框画。 步骤及原理 这里我们还是要先讲述一下步骤,这里先展示下原图 ?...对灰度图片进行高斯模糊 首先,先来讲一下如何进行简单的 模糊 处理 在上一篇文章中我们已经讲过了,图片其实就是一个二维数组。 所以图片上的每一个像素,都有一个像素数值。...这里假定我们选了一个中心灰度值为190的像素点,它的周边像素的像素灰度值为100(255为纯白色)的3*3的像素矩阵 模糊处理的简单形式就是做平均,也就是将中间点的像素点和周围8个像素点的灰度值取平均值...我们可以直接使用全局二值化来加深边框了(计算速度快)。...只有当原本的图像上对应核心周围所有的点都有值时,我们才保留当前核心的值。 ? 膨胀: 膨胀则正好相反,我们将给定的图片根据给定的核放大。 ? 当我们扫描核的任意一点上有值时,当前核心点将会被赋值 ?

    1.8K30

    Adobe Photoshop,选择图像中的颜色范围

    在“载入”窗口中,选择所需的预设文件,然后单击“载入”。 文末教程彩蛋 调整蒙版不透明度和边缘 使用“属性”面板可以调整选定图层或矢量蒙版的不透明度。“浓度”滑块控制蒙版不透明度。...使用“羽化”,可以柔化蒙版的边缘。 其他选项特定于图层蒙版。使用“反相”选项,可以使蒙版区域和未蒙版区域相互调换。“蒙版边缘”选项提供了多种修改蒙版边缘的控件,如“平滑”和“收缩”/“扩展”。...有关“颜色范围”选项的信息,请参阅创建和限制调整图层和填充图层。 更改蒙版密度 在“图层”面板中,选择包含要编辑的蒙版的图层。 在“图层”面板中,单击“蒙版”缩览图。缩览图周围会显示一个边框。...羽化蒙版边缘 在“图层”面板中,选择包含要编辑的蒙版的图层。 在“图层”面板中,单击“蒙版”缩览图。缩览图周围会显示一个边框。 拖动“羽化”滑块为蒙版边缘应用羽化效果。...缩览图周围会显示一个边框。 单击选项栏中的选择并遮住。您可以使用选择并遮住工作区中的选项修改蒙版边缘,并以不同的背景查看蒙版。 在“选择并遮住”工作区中单击“确定”,将更改应用于图层蒙版。

    11.3K50

    【愚公系列】2023年11月 WPF控件专题 Rectangle控件详解

    一、Rectangle控件详解Rectangle控件是WPF中用于绘制矩形形状的控件。它可以在UI中用于多种用途,如绘制边框和填充区域等。...="2"/>在上面的示例中,我们创建了一个50x50的红色矩形,并设置了黑色描边和2像素的线条宽度。...="2" RadiusX="10" RadiusY="10" Opacity="0.5"/>这将创建一个100x100的蓝色矩形,带有10像素半径的圆角、黑色描边和2像素线条宽度,以及50%的不透明度。...VerticalAlignment和HorizontalAlignment:设置矩形在其容器中的垂直和水平对齐方式。Opacity:设置矩形的不透明度。...Name:设置矩形控件的名称,用于在代码中引用该控件。2.常用场景WPF中Rectangle控件常用于以下场景:绘制矩形图形:Rectangle控件可以用于绘制矩形图形并设置矩形的颜色、边框等属性。

    65231

    关于Adobe Photoshop调整选区介绍

    透明度/不透明度:为“视图模式”设置透明度/不透明度。 调整模式 设置“边缘检测”、“调整细线”和“调整边缘画笔工具”所用的边缘调整方法。 颜色识别:为简单背景或对比背景选择此模式。...对象识别:为复杂背景上的毛发或毛皮选择此模式。 边缘检测设置 半径:确定发生边缘调整的选区边框的大小。对锐边使用较小的半径,对较柔和的边缘使用较大的半径。...全局调整设置 平滑:减少选区边界中的不规则区域(“山峰和低谷”)以创建较平滑的轮廓。 羽化:模糊选区与周围的像素之间的过渡效果 对比度:增大时,沿选区边框的柔和边缘的过渡会变得不连贯。...移动边缘:使用负值向内移动柔化边缘的边框,或使用正值向外移动这些边框。向内移动这些边框有助于从选区边缘移去不想要的背景颜色。 输出设置 净化颜色:将彩色边替换为附近完全选中的像素的颜色。...颜色替换的强度与选区边缘的软化度是成比例的。调整滑块以更改净化量。默认值为 100%(最大强度)。由于此选项更改了像素颜色,因此它需要输出到新图层或文档。

    2.5K60

    CSS提高文字的对比度

    向量意味着它们的形状是由点和数学来描述形状的,而不是实际的像素数据。...因为它们是矢量的,所以如果我们可以做其他矢量程序(例如 Adob​​e Illustrator)可以对矢量文本做的事情,比如在单个字符周围画一个笔划,那就有意义了。好吧,我们可以!...对我来说,只有外部文本笔划对齐看起来有什么好处。不幸的是,对于 CSS 和 Illustrator 来说,不可更改的默认设置是居中的。解决方案只是不要对笔触边框的厚度过于疯狂,一切都应该没问题。...您还可以在不规则的线条上设置文字(例如围绕圆形)。用网络文本来做这件事当然很酷。也许我们可以设置文本跟随其父元素的边框路径。...幻想 作为记录,您可以使用任何类型的颜色值作为笔画的颜色(十六进制、rgba、hsla、关键字)。这意味着如果你想要透明笔划,它们确实“堆叠”,因为如果笔划彼此重叠(常见),它们会更暗。

    1.4K30

    实践-小细节 II

    opaque也是表示当前的UIView的不透明度,设置是否之后对于UIView的显示并没有什么影响,官方文档的意思简单点说就是opaque默认为YES,如果alpha小于1,那么应该设置opaque设置为...如果了解opaque,需要点屏幕绘制的知识, 屏幕上的每个像素点都是通过RGBA值(Red、Green、Blue三原色再配上Alpha透明度)表示的, 当纹理(UIView在绘图系统中对应的表示项)出现重叠时..., GPU会按照Result = Source + Destination * (1 - SourceAlpha)公式计算重叠部分的像素。...当SourceAlpha为1时,绘图系统认为下面的颜色全部被遮盖住了, Result=Source,如果Source的Alpha不为0,上下层颜色就会进行合成,所以opaque默认设置YES,提升绘制性能..., 如果开发中UIView是不透明的,opaque设置为YES, 如果opaque设置NO,那么Alpha应该小于1. ?

    72720

    Python之pygame学习绘制基本图形(3)

    pygame绘制 ✕ 这次来说下怎么绘制基本的图形,如矩形,圆,直线等等 ? 这图片的代码在最最最下面!! ?...这些函数可用于渲染任何格式的曲面。渲染到硬件表面将比常规软件表面慢。 大多数函数使用width参数来表示形状边缘周围的笔划(粗细)大小。如果宽度为0,则将填充形状(实线)。...这些函数返回一个矩形,表示已更改像素的边界区域。此边界矩形是包含受影响区域的“最小”边界框。...width > 0 则表示线条粗细 如果使用width,边框的宽度不是很好控制 返回:一个矩形边界变化的像素,如果没有绘制任何东西,返回宽高为0代码演示: pygame.draw.rect(screen...) 如果 width == 0 (默认)则填充内部是实心的内部全部填充颜色 如果 width > 0 则表示线条粗细,空心的代表线条宽度 如果使用width,边框的宽度不是很好控制 返回:一个矩形边界变化的像素

    4.2K30

    【FFmpeg】Filter 过滤器 ③ ( 文字水印 - drawtext 过滤器 | drawtext 过滤器支持库编译配置 | drawtext 过滤器常用参数 )

    背景盒子 ; 显示 文字水印 时 , 可以显示一个背景盒子 , 这个盒子类似于 CSS 中的盒子 , 可以设置边框 , 背景颜色 , 边框可以分别设置 四个方向 的边框属性 , 如 宽度和颜色 ; box...参数可设置三个值 : 1 : 绘制方框 ; 0 : 不绘制方框 ; borderw : 绘制带有指定边框宽度的方框 ; 配置示例 : ffmpeg -i input.mp4 -vf "drawtext...10 像素宽度 , 左右边框 20 像素宽度 ; boxborderw=10|20|30 设置上边框 10 像素宽度 , 左右边框 20 像素宽度 , 下边框 30 像素宽度 ; boxborderw...=10|20|30|40 设置上边框 10 像素宽度 , 右边框 20 像素宽度 , 下边框 30 像素宽度 , 左边框 40 像素宽度 ; 配置示例 : ffmpeg -i input.mp4 -vf...; fontsize 参数 用于设置 文本水印 的 字体大小 , 单位是像素 , 如 : fontsize=24 表示字体大小为 24 像素 ; 代码示例 : ffmpeg -i input.mp4 -

    1.2K10

    WebRender:让网页渲染如丝顺滑

    这意味着,我们要做的不仅仅是想使帧渲染更快...我们希望使渲染更加一致,不会发生闪动。即便有大量需要绘制的像素,如 4k 显示器或 WebVR 设备,我们仍希望体验能够平滑一些。...为了尽可能利用所有内核,创建一定数量的批处理工作,每个批次包括大量形状。 ? 这就是 GPU 如何在数百或数千个内核上切分工作的。正是因为这种极端的并行性,我们才能想到在每一帧中渲染所有内容。...目前,每种类型的图元都需要一种着色器。例如边框着色器,文本着色器,图像着色器。 ? 我们认为可以将很多着色器结合起来,这样就能够增加批处理容量。但目前这样已经相当不错了。...首先做不透明的一道工作。由表及里,渲染所有不透明的形状。跳过位于其他像素背后的像素。 然后处理半透明形状。工作由内向外进行。如果半透明像素落在不透明像素的顶部,则会混合到不透明的像素中。...如果它会落在不透明形状之后,则忽略计算。 将工作分解为不透明和 alpha 通道两部分,跳过不需要的像素计算,这个过程称为 Z-剔除(Z-culling)。

    3K30

    Core Animation实战四(视觉效果)

    这里有一些UIView没有暴露出来的CALayer的功能: 阴影,圆角,带颜色的边框 3D变换 非矩形范围 透明遮罩 多级非线性动画 这篇主要说阴影圆角边框,先看一下Demo效果: ?...,裁剪,边框。...-(void)layerCornerRadiusAndWidth{ //圆角弧度 self.View1.layer.cornerRadius = 30; //是否边框外绘制...双线性滤波算法通过对多个像素取样最终生成新的值,得到一个平滑的表现不错的拉伸。但是当放大倍数比较大的时候图片就模糊不清了。...从名字不难看出,这个算法(也叫最近过滤)就是取样最近的单像素点而不管其他的颜色。这样做非常快,也不会使图片模糊。但是,最明显的效果就是,会使得压缩图片更糟,图片放大之后也显得块状或是马赛克严重。

    54020

    iOS编程101:如何创建圆形头像和圆角图片

    IOS7的一个变化是相对于方形图像,更偏爱于使用圆形图像。在内置的应用中可以看到圆形图标或圆形图像,如联系人和电话应用。...layer对象提供了多种属性,使用它们来控制视图的可视内容: 背景颜色 边框和边框宽度 阴影颜色,宽度等 Opacity(不透明度) 圆角半径 Corner radius就是我们用来绘制圆角和圆形图像的属性...所以上面的第一行是设置layer对象(CALayer类的一个实例)的圆角半径。将方形图像变成圆形图像,半径应设置为UIImageView宽度的一半。例如,如果方形图像的宽度是100像素。...半径应设置为50像素。其次,你必须将clipsToBounds属性设置为YES,这样layer才能生效。 现在编译和运行应用程序,你会得到一个圆形头像。 ? 非常容易吧。...= [UIColor whiteColor].CGColor; 我们只是设置了边框的宽度和边框颜色。

    2.1K20

    iOS开发CoreGraphics核心图形框架之二——深入理解图形上下文

    需要注意,绘制的顺序在CoreGraphics框架中十分重要,如果后绘制的内容和先绘制的内容有位置冲突,后绘制的内容将覆盖先绘制的内容。    ...UIKIT_EXTERN void UIGraphicsBeginImageContext(CGSize size); //方法同上,其中opaque参数设置是否为不透明的 scale设置缩放因子...UIImage对象 UIKIT_EXTERN UIImage* __nullable UIGraphicsGetImageFromCurrentImageContext(void); //结束位图图形上下文的编辑..., //边框绘制并填充 kCGPathEOFillStroke //补集进行边框和填充绘制 */ void CGContextDrawPath(CGContextRef cg_nullable c,...void CGContextStrokeRect(CGContextRef cg_nullable c, CGRect rect); //进行矩形区域的边框绘制 可以设置边框宽度 void CGContextStrokeRectWithWidth

    2.7K20
    领券