Как я окрасил бы изображение программно на iOS?

<select id="countries" onfocus="this.defaultIndex=this.selectedIndex;" onchange="this.selectedIndex=this.defaultIndex;">
<option value="1">Country1</option>
<option value="2">Country2</option>
<option value="3">Country3</option>
<option value="4">Country4</option>
<option value="5">Country5</option>
<option value="6">Country6</option>
<option value="7" selected="selected">Country7</option>
<option value="8">Country8</option>
<option value="9">Country9</option>
</select>

Протестированный и рабочий в IE 6, 7 & 8b2, Firefox 2 & 3, Opera 9.62, Safari 3.2.1 для Windows и Google Chrome.

87
задан Cœur 25 April 2019 в 08:34
поделиться

5 ответов

Сначала вам нужно создать подкласс UIImageView и переопределить метод drawRect. Вашему классу требуется свойство UIColor (назовем его overlayColor) для хранения смешанного цвета и настраиваемый установщик, который вызывает перерисовку при изменении цвета. Примерно так:

- (void) setOverlayColor:(UIColor *)newColor {
   if (overlayColor)
     [overlayColor release];

   overlayColor = [newColor retain];
   [self setNeedsDisplay]; // fires off drawRect each time color changes
}

В методе drawRect вам нужно сначала нарисовать изображение, а затем наложить на него прямоугольник, заполненный желаемым цветом, а также соответствующий режим наложения, примерно так:

- (void) drawRect:(CGRect)area
{
  CGContextRef context = UIGraphicsGetCurrentContext();
  CGContextSaveGState(context);

  // Draw picture first
  //
  CGContextDrawImage(context, self.frame, self.image.CGImage);

  // Blend mode could be any of CGBlendMode values. Now draw filled rectangle
  // over top of image.
  //
  CGContextSetBlendMode (context, kCGBlendModeMultiply);
  CGContextSetFillColor(context, CGColorGetComponents(self.overlayColor.CGColor));      
  CGContextFillRect (context, self.bounds);
  CGContextRestoreGState(context);
}

Обычно для оптимизации рисование, вы ограничили бы фактический рисунок только областью, переданной в drawRect, но поскольку фоновое изображение должно перерисовываться каждый раз при изменении цвета, вероятно, все это потребует обновления.

44
ответ дан 24 November 2019 в 07:46
поделиться

Также вы можете рассмотреть возможность кэширования составного изображения для повышения производительности и просто визуализации его в drawRect :, а затем обновить его, если грязный флаг действительно грязный. Хотя вы можете часто менять его, могут быть случаи, когда появляются отрисовки, и вы не испачкаетесь, поэтому вы можете просто обновить его из кеша. Если память важнее производительности, вы можете игнорировать это :)

0
ответ дан 24 November 2019 в 07:46
поделиться

Единственное, что я могу придумать, - это создать прямоугольный, в основном прозрачный вид с желаемым цветом и наложить его на вид изображения, добавив его в качестве подвида. Я не уверен, действительно ли это окрасит изображение так, как вы себе представляете, хотя я не уверен, как бы вы взломали изображение и выборочно заменили одни цвета другими ... звучит для меня довольно амбициозно.

Например:

UIImageView *yourPicture = (however you grab the image);
UIView *colorBlock = [[UIView alloc] initWithFrame:yourPicture.frame];
//Replace R G B and A with values from 0 - 1 based on your color and transparency
colorBlock.backgroundColor = [UIColor colorWithRed:R green:G blue:B alpha:A];
[yourPicture addSubView:colorBlock];

Документация для UIColor:

colorWithRed:green:blue:alpha:

Creates and returns a color object using the specified opacity and RGB component values.

+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha

Parameters

red    - The red component of the color object, specified as a value from 0.0 to 1.0.

green  - The green component of the color object, specified as a value from 0.0 to 1.0.

blue   - The blue component of the color object, specified as a value from 0.0 to 1.0.



alpha  - The opacity value of the color object, specified as a value from 0.0 to 1.0.

Return Value

The color object. The color information represented by this object is in the device RGB colorspace. 
0
ответ дан 24 November 2019 в 07:46
поделиться

This could be very useful: PhotoshopFramework is one powerful library to manipulate images on Objective-C. This was developed to bring the same functionalities that Adobe Photoshop users are familiar. Examples: Set colors using RGB 0-255, apply blend filers, transformations...

Is open source, here is the project link: https://sourceforge.net/projects/photoshopframew/

5
ответ дан 24 November 2019 в 07:46
поделиться

Просто краткое пояснение (после некоторых исследований по этой теме). В документе Apple здесь четко указано, что:

Класс UIImageView оптимизирован для вывода изображений на дисплей. UIImageView не вызывает метод drawRect: своих подклассов. Если ваш подкласс должен включать пользовательский код рисования, вы должны вместо этого создать подкласс класса UIView .

, так что даже не тратьте время на попытки переопределить этот метод в подклассе UIImageView . Вместо этого начните с UIView .

26
ответ дан 24 November 2019 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: