iOS 용 Xamarin을 사용하여 즉석에서 합성 이미지를 만드는 중입니다. 두 개의 이미지가 있는데 하나는 기본 이미지 (흑백)이고 다른 하나는 컬러 필터의 알파 마스크 '맵'입니다. 그런 다음 런타임에 RGB 값을 제공하여 합성 이미지를 원하는 색상으로 만들 수 있습니다.
전체 이미지를 변경하기위한 많은 솔루션을 찾았지만 마스크 맵에 포함 된 영역 (알파 값 포함)에만 색상을 지정하는 색상 필터를 만드는 데 좋은 솔루션을 찾는 데 어려움이 있습니다.
기본 이미지 :
결과 이미지 (빨간색을 원한다고 말하면) :
MonoDroid에서 사용자 지정 ImageView를 만들고 OnDraw 메서드를 재정의 한 다음 매력처럼 작동하는 ColorMatrixColorFilter를 사용했지만 MonoTouch에서 동일한 작업을 수행하는 방법을 모릅니다.
이것이 내가 MonoDroid를 위해 한 일입니다.
protected override void OnDraw(Canvas canvas)
{
if (_alphaMask == null)
_alphaMask = BitmapFactory.DecodeResource(Resources, GetDrawable("star_mask"));
if(_image == null)
_image = BitmapFactory.DecodeResource(Resources, GetDrawable("star"));
AdjustColor(_color, canvas, _alphaMask, _image);
}
private static void AdjustColor(Color color, Canvas c, Bitmap alphaMask, Bitmap image)
{
float R = color.R;
float G = color.G;
float B = color.B;
var maskPaint = new Paint();
var mat = new[]
{
0, 0, 0, 0, R, //red
0, 0, 0, 0, G, //green
0, 0, 0, 0, B, //blue
0, 0, 0, 1, 0 //alpha
};
ColorMatrix cm = new ColorMatrix(mat);
maskPaint.SetColorFilter(new ColorMatrixColorFilter(cm));
c.DrawBitmap(image, 0, 0, null);
c.DrawBitmap(alphaMask, 0, 0, maskPaint);
}
좋아 ... 가장 우아한 솔루션은 아니지만 두 개 ImageView
를 겹쳐서 만들었습니다 .
기본 이미지 위에 MaskView
다음 방법을 사용하여 색상을 만들었습니다 UIImage
.
private UIImage GetColoredImage(string imageName, Color color)
{
UIImage image = UIImage.FromBundle(imageName);
UIGraphics.BeginImageContext(image.Size);
CGContext context = UIGraphics.GetCurrentContext();
context.TranslateCTM(0, image.Size.Height);
context.ScaleCTM(1.0f, -1.0f);
var rect = new RectangleF(0, 0, image.Size.Width, image.Size.Height);
// draw image, (to get transparancy mask)
context.SetBlendMode(CGBlendMode.Normal);
context.DrawImage(rect, image.CGImage);
// draw the color using the sourcein blend mode so its only draw on the non-transparent pixels
context.SetBlendMode(CGBlendMode.SourceIn);
context.SetFillColor(color.R / 255f, color.G / 255f, color.B / 255f, 1);
context.FillRect(rect);
UIImage coloredImage = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
return coloredImage;
}
누군가가 더 나은 해결책을 가지고 있다면 (어쩌면을 사용 CIFilter
하고있을 것입니다) 나는 그것을보고 싶습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다