Bagaimana saya bisa mengubah tintColor gambar di iOS dan WatchKit


395

Saya memiliki UIImageView yang disebut "theImageView", dengan UIImage dalam satu warna (latar belakang transparan) seperti jantung hitam kiri di bawah ini. Bagaimana saya bisa mengubah warna rona gambar ini secara terprogram di iOS 7 atau lebih tinggi, sesuai metode rona yang digunakan dalam ikon iOS 7+ Navigation Bar?

Bisakah metode ini juga berfungsi di WatchKit untuk aplikasi Apple Watch?

masukkan deskripsi gambar di sini


4
Apa maksudmu "kode berikut ini salah", menetapkan UIImagedengan UIImageRenderingModeAlwaysTemplatedan kemudian menetapkan UIImageVIew's tintColorAPAKAH kerja. (dalam kode saya ^^)
Vinzzz

2
Gunakan png dengan transparansi seperti ini
Alladinian

4
Anda harus benar-benar memindahkan jawaban Anda ke bagian jawaban, karena saya pikir itu yang terbaik dan paling modern.
Richard Venable

Saya berharap bisa menggandakan pertanyaan ini !!
Jacobo Koenig

Jawaban:


764

iOS
Untuk aplikasi iOS, di Swift 3, 4 atau 5:

theImageView.image = theImageView.image?.withRenderingMode(.alwaysTemplate)
theImageView.tintColor = UIColor.red

Untuk Swift 2:

theImageView.image = theImageView.image?.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
theImageView.tintColor = UIColor.redColor()

Sementara itu, solusi Objective-C modern adalah:

theImageView.image = [theImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[theImageView setTintColor:[UIColor redColor]];

Watchkit
Di aplikasi WatchKit untuk Apple Watch, Anda dapat mengatur warna warna untuk gambar templat .

  1. Anda harus menambahkan gambar Anda ke Katalog Aset di Aplikasi WatchKit Anda, dan mengatur set gambar yang akan dirender sebagai Gambar Template di Inspektur Atribut. Tidak seperti aplikasi iPhone, Anda tidak dapat mengatur kode rendering template di Ekstensi WatchKit saat ini.
  2. Setel gambar itu untuk digunakan di WKInterfaceImage Anda di pembuat antarmuka untuk aplikasi Anda
  3. Buat IBOutlet di WKInterfaceController Anda untuk WKInterfaceImage yang disebut 'theImage' ...

Untuk mengatur warna warna dalam Swift 3 atau 4:

theImage.setTintColor(UIColor.red)

Swift 2:

theImage.setTintColor(UIColor.redColor())

Untuk kemudian mengatur warna warna di Objective-C:

[self.theImage setTintColor:[UIColor redColor]];

Jika Anda menggunakan gambar templat dan tidak menerapkan warna warna, Global Tint untuk aplikasi WatchKit Anda akan diterapkan. Jika Anda belum menetapkan Global Tint, theImageakan berwarna biru muda secara default saat digunakan sebagai gambar templat.


2
ini adalah solusi terbaik dan sederhana.
Ankish Jain

4
imageWithRenderingMode terlalu lambat. Di Storyboard dan Aset gambar. Anda dapat mengubah kedua ini juga: Perbarui Mode Render ke Templat Gambar - itu solusi yang lebih baik
Katerina

Sempurna, sekarang saya menggunakan metode ini berdasarkan pada kode Anda: + (UIImageView ) tintImageView: (UIImageView *) imageView withColor: (UIColor ) warna {imageView.image = [imageView.image imageWithRenderingMode: UIImageRenderingModeAlwaysTemplate]; [imageView setTintColor: color]; kembali imageView; }
Josep Escobar

apakah lebih baik dengan gambar hitam?
Bruno

1
Gambar @Bruno tidak harus hitam, tidak. Bekerja dengan warna apa saja.
Duncan Babbage

121

Inilah kategori yang seharusnya melakukan trik

@interface UIImage(Overlay)
@end

@implementation UIImage(Overlay)

- (UIImage *)imageWithColor:(UIColor *)color1
{
        UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextTranslateCTM(context, 0, self.size.height);
        CGContextScaleCTM(context, 1.0, -1.0);
        CGContextSetBlendMode(context, kCGBlendModeNormal);
        CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
        CGContextClipToMask(context, rect, self.CGImage);
        [color1 setFill];
        CGContextFillRect(context, rect);
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return newImage;
}
@end

jadi kamu akan melakukan:

theImageView.image = [theImageView.image imageWithColor:[UIColor redColor]];

Terima kasih atas jawaban yang sangat valid ini, saya kira kode saya sudah ok dari awal, saya harus menjawab pertanyaan saya sendiri dan memberi Anda +1 terlepas ..
kenyal

104

Saya harus melakukan ini di Swift menggunakan extension.

Saya pikir saya akan membagikan bagaimana saya melakukannya:

extension UIImage {
    func imageWithColor(color1: UIColor) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        color1.setFill()

        let context = UIGraphicsGetCurrentContext() as CGContextRef
        CGContextTranslateCTM(context, 0, self.size.height)
        CGContextScaleCTM(context, 1.0, -1.0);
        CGContextSetBlendMode(context, CGBlendMode.Normal)

        let rect = CGRectMake(0, 0, self.size.width, self.size.height) as CGRect
        CGContextClipToMask(context, rect, self.CGImage)
        CGContextFillRect(context, rect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext() as UIImage
        UIGraphicsEndImageContext()

        return newImage
    }
}

Pemakaian:

theImageView.image = theImageView.image.imageWithColor(UIColor.redColor())

Cepat 4

extension UIImage {
    func imageWithColor(color1: UIColor) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        color1.setFill()

        let context = UIGraphicsGetCurrentContext()
        context?.translateBy(x: 0, y: self.size.height)
        context?.scaleBy(x: 1.0, y: -1.0)
        context?.setBlendMode(CGBlendMode.normal)

        let rect = CGRect(origin: .zero, size: CGSize(width: self.size.width, height: self.size.height))
        context?.clip(to: rect, mask: self.cgImage!)
        context?.fill(rect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return newImage!
    }
}

Pemakaian:

theImageView.image = theImageView.image?.imageWithColor(color1: UIColor.red)


1
FYI ini tidak bekerja untuk saya sampai saya pindah color1.setFill()tepat di bawah baris pertama dalam metode ini UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale).
Aaron

@ Harun Diperbarui berdasarkan komentar Anda. Terima kasih.
fulvio

7
@CeceXX gunakan CGBlendMode.Normalsebagai gantinya
Adolfo

2
Anda luar biasa, namun Anda mungkin perlu mengubahnya ke Swift 3
SimpuMind

1
@SimpiMind Disediakan Swift 4 sebagai gantinya.
fulvio

97

Di Storyboard dan Aset gambar. Anda dapat mengubah keduanya juga:

Perbarui Mode Render ke Templat Gambar

Perbarui Mode Render ke Templat Gambar di Aset Gambar

Perbarui Warna warna dalam Tampilan.

Perbarui Warna warna dalam Tampilan dalam Tampilan


22
Ini benar-benar jawaban paling buruk!
naskah merek

1
Menetapkan nilai ini dari storyboard tidak pernah berhasil untuk saya. Saya selalu harus menggunakan imageView.tintColorkode.
Kamil Powałowski

3
@ KamilPowałowski bagi saya ini kadang-kadang berfungsi ... Saya tidak yakin mengapa. Saya berharap saya tahu mengapa itu tidak selalu berhasil. Jadi saya akhirnya melakukannya dengan kode
Jesus Rodriguez

2
Bagi saya, metode papan cerita ini berfungsi pada tombol tetapi tidak pada imageViews. Saya masih harus mengatur tintColor dalam kode untuk imageViews.
Derek Soike

2
Jika seseorang masih menggaruk-garuk kepala bertanya-tanya mengapa itu tidak bekerja di IB, coba atur gambar buram imageView ke No.
Bonan

40

Cepat 4

Ubah warna UIImage SVG / PDF , yang berfungsi untuk gambar dengan warna unik :

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

import Foundation

// MARK: - UIImage extensions

public extension UIImage {

    //
    /// Tint Image
    ///
    /// - Parameter fillColor: UIColor
    /// - Returns: Image with tint color
    func tint(with fillColor: UIColor) -> UIImage? {
        let image = withRenderingMode(.alwaysTemplate)
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        fillColor.set()
        image.draw(in: CGRect(origin: .zero, size: size))

        guard let imageColored = UIGraphicsGetImageFromCurrentImageContext() else {
            return nil
        }

        UIGraphicsEndImageContext()
        return imageColored
    }
}

Ubah warna UIImageView , yang berfungsi untuk gambar dengan warna unik :

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

let imageView = UIImageView(frame: CGRect(x: 50, y: 50, width: 50, height: 50))
imageView.image = UIImage(named: "hello.png")!.withRenderingMode(.alwaysTemplate)
imageView.tintColor = .yellow

Ubah warna UIImage untuk gambar , gunakan itu:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

import Foundation

// MARK: - Extensions UIImage

public extension UIImage {

    /// Tint, Colorize image with given tint color
    /// This is similar to Photoshop's "Color" layer blend mode
    /// This is perfect for non-greyscale source images, and images that 
    /// have both highlights and shadows that should be preserved<br><br>
    /// white will stay white and black will stay black as the lightness of 
    /// the image is preserved
    ///
    /// - Parameter TintColor: Tint color
    /// - Returns:  Tinted image
    public func tintImage(with fillColor: UIColor) -> UIImage {

        return modifiedImage { context, rect in
            // draw black background - workaround to preserve color of partially transparent pixels
            context.setBlendMode(.normal)
            UIColor.black.setFill()
            context.fill(rect)

            // draw original image
            context.setBlendMode(.normal)
            context.draw(cgImage!, in: rect)

            // tint image (loosing alpha) - the luminosity of the original image is preserved
            context.setBlendMode(.color)
            fillColor.setFill()
            context.fill(rect)

            // mask by alpha values of original image
            context.setBlendMode(.destinationIn)
            context.draw(context.makeImage()!, in: rect)
        }
    }

    /// Modified Image Context, apply modification on image
    ///
    /// - Parameter draw: (CGContext, CGRect) -> ())
    /// - Returns:        UIImage
    fileprivate func modifiedImage(_ draw: (CGContext, CGRect) -> ()) -> UIImage {

        // using scale correctly preserves retina images
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        let context: CGContext! = UIGraphicsGetCurrentContext()
        assert(context != nil)

        // correctly rotate image
        context.translateBy(x: 0, y: size.height)
        context.scaleBy(x: 1.0, y: -1.0)

        let rect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)

        draw(context, rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image!
    }
}

1
hei, saya baru di swift, tetapi Anda mengatakan di sini bahwa itu untuk gambar SVG, tapi saya tidak dapat menemukan cara untuk mem-parsing SVG ke UIImage, bisakah Anda membantu saya? atau mungkin entah bagaimana saya bisa menangani ini dengan SVG dengan benar. Terima kasih!
Dumitru Rogojinaru

@DumitruRogojinaru menggunakan fonction SVG dengan gambar templat di aset
YannSteph

Mengapa perlu menerjemahkan dan skala pada "func modifiedImage"?
Luca Davanzo

Pembaruan untuk Swift 4
YannSteph

36

Jika ada yang peduli solusi tanpa UIImageView:

// (Swift 3)
extension UIImage {
    func tint(with color: UIColor) -> UIImage {
        var image = withRenderingMode(.alwaysTemplate)
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        color.set()

        image.draw(in: CGRect(origin: .zero, size: size))
        image = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return image
    }
}

Wow, bekerja seperti sulap setelah mencari ini selama + jam. Diperlukan untuk: Mengatur ikon di NSTextAttachment dalam warna yang berbeda dari yang asli ikon. Jawaban standar untuk menggunakan UIImageView dan mengubah tintColor tidak berfungsi di sini, karena NSTextAttachment tidak menggunakan UIImageView.
marco

1
Ini adalah solusi terbaik yang saya temukan sejauh ini terutama bagi siapa pun yang mencari kode yang berfungsi dengan Swift 3. Saran hebat!
shashwat

17

Dengan Swift

let commentImageView = UIImageView(frame: CGRectMake(100, 100, 100, 100))
commentImageView.image = UIImage(named: "myimage.png")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)
commentImageView.tintColor = UIColor.blackColor()
addSubview(commentImageView)

3
Anda cukup menempatkan .AlwaysTemplate.
Rui Peres

ya, itu memang memperpendek kode, tetapi sepertinya itu mungkin mengurangi kejelasan kode. tidak yakin tentang pintasan titik karena itu
Esqarrouth

Saya melihat POV Anda, hanya sebuah alternatif.
Rui Peres

4

Coba ini

http://robots.thoughtbot.com/designing-for-ios-blending-modes

atau

- (void)viewDidLoad
{
[super viewDidLoad];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 300, 50)];
label.numberOfLines = 0;
label.font = [UIFont systemFontOfSize:13];
label.text = @"These checkmarks use the same gray checkmark image with a tintColor applied to the image view";
[self.view addSubview:label];

[self _createImageViewAtY:100 color:[UIColor purpleColor]];
}

- (void)_createImageViewAtY:(int)y color:(UIColor *)color {
UIImage *image = [[UIImage imageNamed:@"gray checkmark.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
CGRect frame = imageView.frame;
frame.origin.x = 100;
frame.origin.y = y;
imageView.frame = frame;

if (color)
    imageView.tintColor = color;

[self.view addSubview:imageView];
}

4

Untuk 3 tujuan cepat

theImageView.image = theImageView.image!.withRenderingMode(.alwaysTemplate) theImageView.tintColor = UIColor.red


2

Untuk mewarnai gambar UIButton

let image1 = "ic_shopping_cart_empty"
btn_Basket.setImage(UIImage(named: image1)?.withRenderingMode(.alwaysTemplate), for: .normal)
btn_Basket.setImage(UIImage(named: image1)?.withRenderingMode(.alwaysTemplate), for: .selected)
btn_Basket.imageView?.tintColor = UIColor(UIColor.Red)

2

iOS

Solusi untuk melakukannya dari Interface Builder, atur param templateImage di keyPath dan pilih warna warna Anda dari IB

extension UIImageView {

// make template image with tint color
var templateImage: Bool {
    set {
        if newValue, let image = self.image {
            let newImage = image.withRenderingMode(.alwaysTemplate)
            self.image = newImage
        }
    } get {
        return false
    }
}

}


2

Dengan iOS 13 dan lebih baru, Anda cukup menggunakan

let image = UIImage(named: "Heart")?.withRenderingMode(.alwaysTemplate)
if #available(iOS 13.0, *) {
   imageView.image = image?.withTintColor(UIColor.white)
}

1

Manfaatkan Ekstensi dalam Swift: -

extension UIImageView {
    func changeImageColor( color:UIColor) -> UIImage
    {
        image = image!.withRenderingMode(.alwaysTemplate)
        tintColor = color
        return image!
    }
}

   //Change color of logo 
   logoImage.image =  logoImage.changeImageColor(color: .red)

masukkan deskripsi gambar di sini


1

Swift 3 versi ekstensi jawaban dari fuzz

func imageWithColor(color: UIColor) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
    color.setFill()

    let context = UIGraphicsGetCurrentContext()! as CGContext
    context.translateBy(x: 0, y: self.size.height)
    context.scaleBy(x: 1.0, y: -1.0);
    context.setBlendMode(.normal)

    let rect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height) as CGRect
    context.clip(to: rect, mask: self.cgImage!)
    context.fill(rect)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()! as UIImage
    UIGraphicsEndImageContext()

    return newImage
}

0

Sekarang saya menggunakan metode ini berdasarkan respons Duncan Babbage:

+ (UIImageView *) tintImageView: (UIImageView *)imageView withColor: (UIColor*) color{
    imageView.image = [imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    [imageView setTintColor:color];
    return imageView;
}

0

Anda dapat menggunakan ini di Swift 3 jika Anda memiliki gambar untuk mengganti tombol hapus

func addTextfieldRightView(){

    let rightViewWidth:CGFloat = 30

    let viewMax = self.searchTxt.frame.height
    let buttonMax = self.searchTxt.frame.height - 16

    let buttonView = UIView(frame: CGRect(
        x: self.searchTxt.frame.width - rightViewWidth,
        y: 0,
        width: viewMax,
        height: viewMax))

    let myButton = UIButton(frame: CGRect(
        x: (viewMax - buttonMax) / 2,
        y: (viewMax - buttonMax) / 2,
        width: buttonMax,
        height: buttonMax))

    myButton.setImage(UIImage(named: "BlueClear")!, for: .normal)

    buttonView.addSubview(myButton)

    let clearPressed = UITapGestureRecognizer(target: self, action: #selector(SearchVC.clearPressed(sender:)))
    buttonView.isUserInteractionEnabled = true
    buttonView.addGestureRecognizer(clearPressed)

    myButton.addTarget(self, action: #selector(SearchVC.clearPressed(sender:)), for: .touchUpInside)

    self.searchTxt.rightView = buttonView
    self.searchTxt.rightViewMode = .whileEditing
}

0

Subclass yang dapat digunakan dari kode dan Interface Builder juga:

@implementation TintedImageView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setup];
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self setup];
    }
    return self;
}

-(void)setup {
    self.image = [self.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
}

@end

0

Ini adalah ekstensi UIImage saya dan Anda dapat langsung menggunakan fungsi changeTintColor untuk gambar.

extension UIImage {

    func changeTintColor(color: UIColor) -> UIImage {
        var newImage = self.withRenderingMode(.alwaysTemplate)
        UIGraphicsBeginImageContextWithOptions(self.size, false, newImage.scale)
        color.set()
        newImage.draw(in: CGRect(x: 0.0, y: 0.0, width: self.size.width, height: self.size.height))
        newImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return newImage
    }

    func changeColor(color: UIColor) -> UIImage {
        let backgroundSize = self.size
        UIGraphicsBeginImageContext(backgroundSize)
        guard let context = UIGraphicsGetCurrentContext() else {
            return self
        }
        var backgroundRect = CGRect()
        backgroundRect.size = backgroundSize
        backgroundRect.origin.x = 0
        backgroundRect.origin.y = 0

        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0
        color.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
        context.setFillColor(red: red, green: green, blue: blue, alpha: alpha)
        context.translateBy(x: 0, y: backgroundSize.height)
        context.scaleBy(x: 1.0, y: -1.0)
        context.clip(to: CGRect(x: 0.0, y: 0.0, width: self.size.width, height: self.size.height),
                 mask: self.cgImage!)
        context.fill(backgroundRect)

        var imageRect = CGRect()
        imageRect.size = self.size
        imageRect.origin.x = (backgroundSize.width - self.size.width) / 2
        imageRect.origin.y = (backgroundSize.height - self.size.height) / 2

        context.setBlendMode(.multiply)
        context.draw(self.cgImage!, in: imageRect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage!
    }

}

Contoh penggunaan seperti ini

let image = UIImage(named: "sample_image")
imageView.image = image.changeTintColor(color: UIColor.red)

Dan Anda dapat menggunakan changeColorfungsi perubahan untuk mengubah warna gambar


0

profileImageView.image = theImageView.image! .withRenderingMode (.alwaysTemplate)
profileImageView.tintColor = UIColor.green

ATAU

Pertama pilih gambar tertentu dalam aset gambar dan kemudian pilih memerah sebagai Templat daripada Default dan setelah itu menulis baris profileImageView.tintColor = UIColor.green


0

jika Anda memiliki id untuk gambar SVG, Anda dapat mengisi warna sehubungan dengan ID.

    let image = SVGKImage(named: "iconName")
    let svgIMGV = SVGKFastImageView(frame: self.imgView.frame)
         svgIMGV.image = image
          svgIMGV.fillTintColor(colorImage: UIColor.red, iconID: "Bank")
// Add in extension SVGKImageView
extension SVGKImageView {
 func fillTintColor(colorImage: UIColor, iconID: String) {
        if self.image != nil && self.image.caLayerTree != nil {
            print(self.image.caLayerTree.sublayers)
            guard let sublayers = self.image.caLayerTree.sublayers else { return }
            fillRecursively(sublayers: sublayers, color: colorImage, iconID: iconID)
        }
    }

     private func fillRecursively(sublayers: [CALayer], color: UIColor, iconID: String, hasFoundLayer: Bool) {
        var isLayerFound = false
        for layer in sublayers {
            if let l = layer as? CAShapeLayer {

                print(l.name)                
                //IF you want to color the specific shapelayer by id else remove the l.name  == "myID"  validation
                if let name =  l.name,  hasFoundLayer == true && name == "myID" {
                    self.colorThatImageWIthColor(color: color, layer: l)
                    print("Colouring FInished")
                }
            } else {
                if layer.name == iconID {
                    if let innerSublayer = layer.sublayers as? [CAShapeLayer] {
                        fillRecursively(sublayers: innerSublayer, color: color, iconID: iconID, hasFoundLayer: true )
                        print("FOund")
                    }
                } else {
                    if let l = layer as? CALayer, let sub = l.sublayers {
                        fillRecursively(sublayers: sub, color: color, iconID: iconID, hasFoundLayer: false)
                    }
                }
            }

        }
    }

    func colorThatImageWIthColor(color: UIColor, layer: CAShapeLayer) {
        if layer.strokeColor != nil {
            layer.strokeColor = color.cgColor
        }
        if layer.fillColor != nil {
            layer.fillColor = color.cgColor
        }
    }

}

ATAU Lihat contoh ini.

https://github.com/ravisfortune/SVGDEMO


0
let navHeight = self.navigationController?.navigationBar.frame.height;
let menuBtn = UIButton(type: .custom)
menuBtn.frame = CGRect(x: 0, y: 0, width: 45, height: navHeight!)     
menuBtn.setImage(UIImage(named:"image_name")!.withRenderingMode(.alwaysTemplate), for: .normal)        
menuBtn.tintColor = .black
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.