首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >替换SKSpriteNode中的颜色/颜色

替换SKSpriteNode中的颜色/颜色
EN

Stack Overflow用户
提问于 2016-04-21 05:08:16
回答 2查看 806关注 0票数 2

我想在我的SpriteKit精灵中将一个指定的颜色更改为alpha,让所有其他颜色不受影响。我不认为有一个‘容易’的方式来做到这一点,并可能需要一个定制的着色器。

有人知道如何在Swift或Objective中这样做吗?

这是图像-我设计它的黑色背景,因为它更容易看到,但在我的程序,我希望背景是透明的。

如果我想编辑背景已经设置为alpha的图像,那么我使用的包(Pixaki)将显示为白色和灰色的检查,所以看起来如下:

EN

回答 2

Stack Overflow用户

发布于 2016-04-21 13:58:45

  1. 您不应该在代码中执行预先处理的那些资产的准备工作。

下面是示例代码,它可以实现您想要的结果。

它是基于这个answer(只是基本转换为Swift,经过一些修改)。学分就在那里。

代码语言:javascript
运行
AI代码解释
复制
// color - source color, which is must be replaced
// withColor - target color
// tolerance - value in range from 0 to 1
func replaceColor(color:SKColor, withColor:SKColor, image:UIImage, tolerance:CGFloat) -> UIImage{

    // This function expects to get source color(color which is supposed to be replaced) 
    // and target color in RGBA color space, hence we expect to get 4 color components: r, g, b, a
    assert(CGColorGetNumberOfComponents(color.CGColor) == 4 && CGColorGetNumberOfComponents(withColor.CGColor) == 4,
           "Must be RGBA colorspace")

    // Allocate bitmap in memory with the same width and size as source image
    let imageRef = image.CGImage
    let width = CGImageGetWidth(imageRef)
    let height = CGImageGetHeight(imageRef)

    let colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB)!

    let bytesPerPixel = 4
    let bytesPerRow = bytesPerPixel * width;
    let bitsPerComponent = 8
    let bitmapByteCount = bytesPerRow * height

    let rawData = UnsafeMutablePointer<UInt8>.alloc(bitmapByteCount)

    let context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace,
                                        CGImageAlphaInfo.PremultipliedLast.rawValue | CGBitmapInfo.ByteOrder32Big.rawValue)


    let rc = CGRect(x: 0, y: 0, width: width, height: height)

    // Draw source image on created context
    CGContextDrawImage(context, rc, imageRef)


    // Get color components from replacement color
    let withColorComponents = CGColorGetComponents(withColor.CGColor)
    let r2 = UInt8(withColorComponents[0] * 255)
    let g2 = UInt8(withColorComponents[1] * 255)
    let b2 = UInt8(withColorComponents[2] * 255)
    let a2 = UInt8(withColorComponents[3] * 255)

    // Prepare to iterate over image pixels
    var byteIndex = 0

    while byteIndex < bitmapByteCount {

        // Get color of current pixel
        let red:CGFloat = CGFloat(rawData[byteIndex + 0])/255
        let green:CGFloat = CGFloat(rawData[byteIndex + 1])/255
        let blue:CGFloat = CGFloat(rawData[byteIndex + 2])/255
        let alpha:CGFloat = CGFloat(rawData[byteIndex + 3])/255

        let currentColor = SKColor(red: red, green: green, blue: blue, alpha: alpha);

        // Compare two colors using given tolerance value
        if compareColor(color, withColor: currentColor , withTolerance: tolerance) {

            // If the're 'similar', then replace pixel color with given target color
            rawData[byteIndex + 0] = r2
            rawData[byteIndex + 1] = g2
            rawData[byteIndex + 2] = b2
            rawData[byteIndex + 3] = a2
        }

        byteIndex = byteIndex + 4;
    }

    // Retrieve image from memory context
    let imgref = CGBitmapContextCreateImage(context)
    let result = UIImage(CGImage: imgref!)

    // Clean up a bit
    rawData.destroy()

    return result
}

func compareColor(color:SKColor, withColor:SKColor, withTolerance:CGFloat) -> Bool {

    var r1: CGFloat = 0.0, g1: CGFloat = 0.0, b1: CGFloat = 0.0, a1: CGFloat = 0.0;
    var r2: CGFloat = 0.0, g2: CGFloat = 0.0, b2: CGFloat = 0.0, a2: CGFloat = 0.0;

    color.getRed(&r1, green: &g1, blue: &b1, alpha: &a1);
    withColor.getRed(&r2, green: &g2, blue: &b2, alpha: &a2);

    return fabs(r1 - r2) <= withTolerance &&
        fabs(g1 - g2) <= withTolerance &&
        fabs(b1 - b2) <= withTolerance &&
        fabs(a1 - a2) <= withTolerance;
}

您可以调整它并创建命令行工具,或者在代码中直接使用它。

下面是示例项目:https://github.com/andrey-str/soa-replace-a-color-colour-in-a-skspritenode

免责声明:代码可能泄漏,我是Swift的新手。

  1. 这里有一个更简单的方法:-) $ brew安装imagemagick $转换B2CkX.png -fuzz 90% -transparent黑色result.png

90% -是一个公差值,结果与上面的代码相同。

祝好运!

票数 0
EN

Stack Overflow用户

发布于 2022-05-21 07:45:39

老问题,斯威夫特5回答:遮住UIImage的颜色。

(由于这在UIImage.cgImage上有效,您可能认为它也适用于SKTexture.cgImage,但遗憾的是没有,因此我们需要首先转换为UIImage。

首先,将sprite纹理转换为UIImage,然后使用:

代码语言:javascript
运行
AI代码解释
复制
extension UIImage {
    func remove(color: UIColor, tolerance: CGFloat = 4) -> UIImage {
        let ciColor = CIColor(color: color)
        let maskComponents: [CGFloat] = [ciColor.red, ciColor.green, ciColor.blue].flatMap { value in
            [(value * 255) - tolerance, (value * 255) + tolerance]
        }
        
        guard let masked = cgImage?.copy(maskingColorComponents: maskComponents) else { return self }
        return UIImage(cgImage: masked)
    }
}

在macOS上,我们需要一个NSImage来完成这个任务:

代码语言:javascript
运行
AI代码解释
复制
extension NSImage {
    func remove(color: NSColor, tolerance: CGFloat = 4) -> NSImage {
        if let ciColor = CIColor(color: color) {
            let maskComponents: [CGFloat] = [ciColor.red, ciColor.green, ciColor.blue].flatMap { value in
                [(value * 255) - tolerance, (value * 255) + tolerance]
            }
            
            guard let masked = cgImage(forProposedRect: nil, context: nil, hints: nil)?.copy(maskingColorComponents: maskComponents) else { return self }
            return NSImage(cgImage: masked, size: size)
        }

        return self
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36770611

复制
相关文章
用 Cyberduck下载 / 上传 Google Drive 大文件
用Google Colab训练模型时,可以将训练好的权重模型存储到Google Drive上,很方便。但是,将模型权重下载下来就特别麻烦。另外,上传bert模型和数据集也特别困难。尝试了一些方法,最好的方法是使用Cyberduck(就是下面这个鸭子),传输稳定,并且可以断点续传。
SeanCheney
2020/05/09
4.1K0
用 Cyberduck下载 / 上传 Google Drive 大文件
文件上传和下载
​ encType=multipart/form-data 表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼 接,然后以二进制流的形式发送给服务器。
上分如喝水
2021/08/16
1.2K0
文件上传和下载
文件上传和下载
进行javaWeb项目的开发,文件上传和下载还是被比较普遍的使用到一种技术,之前都是使用专用的文件服务器进行文件的存储,今天要介绍的是基于mongodb数据库进行文件的存储。
码农王同学
2020/03/25
1.1K0
文件上传和下载
文件上传和下载是JAVA WEB中常见的一种操作,文件上传主要是将文件通过IO流传输到服务器的某一个特定的文件夹下;刚开始工作那会一个上传文件常常花费小半天的时间。自从有了springboot之后,简单到小学生都会的操作。废话不说,直接开始。
用户3467126
2019/07/03
1.1K0
文件上传和下载
文件上传要求form表单的请求方式必须为post,并且添加属性enctype="multipart/form-data"
用户9615083
2022/12/25
1.1K0
文件上传和下载
JAVA 文件上传 和 下载
文件上传,也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。
叫我阿杰好了
2022/11/07
2K0
JAVA 文件上传 和 下载
内网安全-上传和下载
利用FTP协议上传文件sudo apt-get install vsftpd -ysudo mkdir /ftp && cd /ftp && mkdir uploadfilesudo chmod 777 -R /ftp/uploadfilevim /etc/vsftpd.conf anonymous_enable=YESanon_root=/ftp/uploadfileno_anon_password=YESwrite_enable=YESanon_upload_enable=YESanon_mkdir_w
浪子云
2022/07/18
4310
SpringMVC:文件上传和下载
一旦设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,而对于文件上传的处理则涉及在服务器端解析原始的HTTP响应。在2003年,Apache Software Foundation发布了开源的Commons FileUpload组件,其很快成为Servlet/JSP程序员上传文件的最佳选择。
冷环渊
2021/11/17
5700
SpringMVC:文件上传和下载
ResponseEntity用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文
愷龍
2023/02/27
7030
文件的上传和下载
文件的上传和下载,是非常常见的功能,在很多的系统中,或者软件中都经常使用文件的上传和下载。 比如:QQ头像,就使用了上传 邮箱中也有附件的上传和下载的功能
技术交流
2022/11/18
1.3K0
文件的上传和下载
Google Earth Engine(GEE)——显示和下载影像出现的问题
当我们下载或者展示影像的时候会出现错误,本文主要解决两个问题,第一个就是解决影像展示的问题,展示如果不能正常显示影像的RGB影像,一般情况下主要出现的问题就在于最大值和最小值的设定,如果你不知道该如何设置,就直接去掉min和max的设置。这样也能正常显示,
此星光明
2024/02/02
4890
Google Earth Engine(GEE)——显示和下载影像出现的问题
解决Rclone挂载Google Drive时上传失败和内存占用高等问题
说明:之前看到有些人评论使用Rclone挂载Gdrive时,会出现部分文件上传失败和挂载崩掉等问题,后者在挂载OneDrive时也会出现,所以这里就专门花了点时间测试了下这些问题,然后就水个解决方法。一般挂载Gdrive的时候,默认是使用的官方提供的api,所以高峰期上传文件的时候,由于很多人在用,导致api的流量上限,会出现各种403,ratelimit等错误,最常见的报错提示为:Failed to get file: googleapi: Error 403: Rate Limit Exceeded, rateLimitExceeded,然后目前的解决方法就是使用自己的api。至于挂载崩掉的问题是可以通过调整部分参数来解决,这里就都一起说下。
子润先生
2021/06/01
5.9K0
vue文件上传和下载_vue上传文件组件
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170641.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
2.4K0
基于SpringMVC的上传和下载
注意:form的一个属性值     enctype="multipart/form-data"
CBeann
2023/12/25
1370
基于SpringMVC的上传和下载
python对接oss上传和下载
https://help.aliyun.com/document_detail/85288.html
阿超
2022/08/21
6.2K0
文件上传和下载(Linux系统)
在xshell中进入到文件存放的目录下后,使用sz +传输的文件名,然后回车,就可以把文件传输到本地电脑了
逸轩
2021/09/13
18.3K0
SpringMVC:commons文件上传和下载
一旦设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,而对于文件上传的处理则涉及在服务器端解析原始的HTTP响应。在2003年,Apache Software Foundation发布了开源的Commons FileUpload组件,其很快成为Servlet/JSP程序员上传文件的最佳选择。
冷环渊
2021/10/19
6560
大文件的上传和下载
文件小的时候,客户端和服务端之间的文件传输。很难感知出问题来。如果文件比较大了,不管是从服务器下载文件还是往服务器上传文件都是一个问题。这里插入一个分治思维、大文件的上传和下载能很好的体现该思维。如果一个问题比较难,我们可以不断的拆解成很多个子问题,不断拆开直到我们能解子问题。当我们把多个子问题解决完的时候,距离目标已经很近了。(拆分和聚合)
猿哥
2019/04/24
3.8K0
nginx实现文件上传和下载
这篇文章给大家分享的是nginx实现文件上传和下载的方法。小编觉得挺实用的,因此分享给大家学习。如下资料是关于实现文件上传和下载的方法的内步骤。
子润先生
2021/08/03
11K0
【不用框架】文件上传和下载
什么是文件上传? 文件上传就是把用户的信息保存起来。 为什么需要文件上传? 在用户注册的时候,可能需要用户提交照片。那么这张照片就应该要进行保存。 上传组件(工具) 为什么我们要使用上传工具? 为啥我们需要上传组件呢?当我们要获取客户端的数据,我们一般是通过getParameter()方法来获取的。 上传文件数据是经过MIME协议进行分割的,表单进行了二进制封装。也就是说:getParameter()无法获取得到上传文件的数据。 我们首先来看看文件上传http是怎么把数据带过去的 jsp页面,表单一定要指定
Java3y
2018/03/15
1.7K0
【不用框架】文件上传和下载

相似问题

下载和上传速度

30

测量下载、上传和Ping

10

SFTP文件下载和上传权限

10

WireGuard:限制下载和上传带宽

10

使用Iperf3测试上传和下载

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文