gpt4 book ai didi

iOS:在 uiimage 上具有发光/阴影效果的羽毛

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:46:41 24 4
gpt4 key购买 nike

我正在尝试找到一种方法来在 UIImage 周围应用带有阴影的羽化效果,而不是我在 iOS 中使用的 UIImageView,我还找不到任何完美的解决方案.我有一个想法,它可以通过屏蔽来完成,但我对 CoreGraphics 很陌生。

如果有人能帮忙。

谢谢。

最佳答案

好吧: 我一直在寻找同样的东西,但不幸的是没有运气。我决定创建自己的 feather(ing) 代码。

将这段代码添加到UIImage扩展中,然后调用[image featherImageWithDepth:4],4只是例子。尝试保持尽可能低的深度。

//==============================================================================


- (UIImage*)featherImageWithDepth:(int)featherDepth {

// First get the image into your data buffer
CGImageRef imageRef = [self CGImage];
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData = (unsigned char*) calloc(height * width * 4, sizeof(unsigned char));
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);


// Now your rawData contains the image data in the RGBA8888 pixel format.
NSUInteger byteIndex = 0;



NSUInteger rawDataCount = width*height;
for (int i = 0 ; i < rawDataCount ; ++i, byteIndex += bytesPerPixel) {

NSInteger alphaIndex = byteIndex + 3;

if (rawData[alphaIndex] > 100) {

for (int row = 1; row <= featherDepth; row++) {
if (testBorderLayer((long)alphaIndex,
rawData,
(long)rawDataCount,
(long)width,
(long)height,
row)) {

int destinationAlpha = 255 / (featherDepth+1) * (row + 1);
double alphaDiv = (double)destinationAlpha / (double)rawData[alphaIndex];

rawData[alphaIndex] = destinationAlpha;
rawData[alphaIndex-1] = (double)rawData[alphaIndex-1] * alphaDiv;
rawData[alphaIndex-2] = (double)rawData[alphaIndex-2] * alphaDiv;
rawData[alphaIndex-3] = (double)rawData[alphaIndex-3] * alphaDiv;

// switch (row) {
// case 1:
// rawData[alphaIndex-1] = 255;
// rawData[alphaIndex-2] = 0;
// rawData[alphaIndex-3] = 0;
// break;
// case 2:
// rawData[alphaIndex-1] = 0;
// rawData[alphaIndex-2] = 255;
// rawData[alphaIndex-3] = 0;
// break;
// case 3:
// rawData[alphaIndex-1] = 0;
// rawData[alphaIndex-2] = 0;
// rawData[alphaIndex-3] = 255;
// break;
// case 4:
// rawData[alphaIndex-1] = 127;
// rawData[alphaIndex-2] = 127;
// rawData[alphaIndex-3] = 0;
// break;
// case 5:
// rawData[alphaIndex-1] = 127;
// rawData[alphaIndex-2] = 0;
// rawData[alphaIndex-3] = 127;
// case 6:
// rawData[alphaIndex-1] = 0;
// rawData[alphaIndex-2] = 127;
// rawData[alphaIndex-3] = 127;
// break;
// default:
// break;
// }

break;

}
}
}
}


CGImageRef newCGImage = CGBitmapContextCreateImage(context);

UIImage *result = [UIImage imageWithCGImage:newCGImage scale:[self scale] orientation:UIImageOrientationUp];

CGImageRelease(newCGImage);

CGContextRelease(context);
free(rawData);

return result;
}


//==============================================================================


bool testBorderLayer(long byteIndex,
unsigned char *imageData,
long dataSize,
long pWidth,
long pHeight,
int border) {


int width = border * 2 + 1;
int height = width - 2;

// run thru border pixels
// |-|
// | |
// |-|

//top,bot - hor
for (int i = 1; i < width - 1; i++) {


long topIndex = byteIndex + 4 * ( - border * pWidth - border + i);
long botIndex = byteIndex + 4 * ( border * pWidth - border + i);

long destColl = byteIndex/4 % pWidth - border + i;

if (destColl > 1 && destColl < pWidth) {
if (testPoint(topIndex, imageData, dataSize) ||
testPoint(botIndex, imageData, dataSize)) {
return true;
}

}

}


//left,right - ver
if (byteIndex / 4 % pWidth < pWidth - border - 1) {
for (int k = 0; k < height; k++) {
long rightIndex = byteIndex + 4 * ( border - (border) * pWidth + pWidth * k);

if (testPoint(rightIndex, imageData, dataSize)) {
return true;
}
}
}

if (byteIndex / 4 % pWidth > border) {

for (int k = 0; k < height; k++) {
long leftIndex = byteIndex + 4 * ( - border - (border) * pWidth + pWidth * k);

if (testPoint(leftIndex, imageData, dataSize)) {
return true;
}
}
}

return false;
}


//==============================================================================


bool testPoint(long pointIndex, unsigned char *imageData, long dataSize) {
if (pointIndex >= 0 && pointIndex < dataSize * 4 - 1 &&
imageData[pointIndex] < 30) {
return true;
}
return false;
}

//==============================================================================

抱歉很少评论 ;)

关于iOS:在 uiimage 上具有发光/阴影效果的羽毛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21899995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com