gpt4 book ai didi

ios - 修整 UIImage 白色边框

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:43:49 29 4
gpt4 key购买 nike

我找不到裁剪包含白色边框的图像的方法。

The image to crop

目前它是一个 UIImage,我尝试了一些解决方案,例如 UIImage+TrimCKImageAddons但是那些图书馆没有用。我认为部分问题是由于图像压缩(我认为),边框不是完全白色

有没有人找到解决方案?

谢谢,

最佳答案

好吧,我会使用 UIImage+Trim 并改变它计算可见白色像素的方式(因此如果 RGB > 255 - small_number_that_still_makes_it_white_but_suffices_to_cut_like_5_to_10)而不是计算非透明像素。

快速查看后,计数循环在这里:

for (NSInteger row = 0; row < height; row++) {

for (NSInteger col = 0; col < width; col++) {

if (fullyOpaque) {

// Found non-transparent pixel
if (bitmapData[row*bytesPerRow + col] == UINT8_MAX) {

rowSum[row]++;
colSum[col]++;

}

} else {

// Found non-transparent pixel
if (bitmapData[row*bytesPerRow + col]) {

rowSum[row]++;
colSum[col]++;

}

}

}

}

下面进行切割,去掉等于0的rowSum和colSum。

此外,它似乎创建了用于计数的内部图像:

CGContextRef contextRef = CGBitmapContextCreate(bitmapData, (NSUInteger)width, (NSUInteger)height, 8, (NSUInteger)bytesPerRow, NULL, kCGImageAlphaOnly);

改用灰度图像应该是将其从透明度测试更改为颜色测试的简单方法。

编辑:好的,解决方案:

- (UIEdgeInsets)transparencyInsetsByCuttingWhitespace:(UInt8)tolerance
{
// Draw our image on that context
NSInteger width = (NSInteger)CGImageGetWidth([self CGImage]);
NSInteger height = (NSInteger)CGImageGetHeight([self CGImage]);
NSInteger bytesPerRow = width * (NSInteger)sizeof(uint8_t);

// Allocate array to hold alpha channel
uint8_t * bitmapData = calloc((size_t)(width * height), sizeof(uint8_t));

// Create grayscale image
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGContextRef contextRef = CGBitmapContextCreate(bitmapData, (NSUInteger)width, (NSUInteger)height, 8, (NSUInteger)bytesPerRow, colorSpace, kCGImageAlphaNone);

CGImageRef cgImage = self.CGImage;
CGRect rect = CGRectMake(0, 0, width, height);
CGContextDrawImage(contextRef, rect, cgImage);

// Sum all non-transparent pixels in every row and every column
uint16_t * rowSum = calloc((size_t)height, sizeof(uint16_t));
uint16_t * colSum = calloc((size_t)width, sizeof(uint16_t));

// Enumerate through all pixels
for (NSInteger row = 0; row < height; row++) {

for (NSInteger col = 0; col < width; col++) {

// Found darker pixel
if (bitmapData[row*bytesPerRow + col] <= UINT8_MAX - tolerance) {

rowSum[row]++;
colSum[col]++;

}
}
}

// Initialize crop insets and enumerate cols/rows arrays until we find non-empty columns or row
UIEdgeInsets crop = UIEdgeInsetsZero;

// Top
for (NSInteger i = 0; i < height; i++) {

if (rowSum[i] > 0) {

crop.top = i;
break;

}

}

// Bottom
for (NSInteger i = height - 1; i >= 0; i--) {

if (rowSum[i] > 0) {
crop.bottom = MAX(0, height - i - 1);
break;
}

}

// Left
for (NSInteger i = 0; i < width; i++) {

if (colSum[i] > 0) {
crop.left = i;
break;
}

}

// Right
for (NSInteger i = width - 1; i >= 0; i--) {

if (colSum[i] > 0) {

crop.right = MAX(0, width - i - 1);
break;

}
}

free(bitmapData);
free(colSum);
free(rowSum);

CGContextRelease(contextRef);

return crop;
}

- (UIImage *)imageByTrimmingWhitePixelsWithOpacity:(UInt8)tolerance
{
if (self.size.height < 2 || self.size.width < 2) {

return self;

}

CGRect rect = CGRectMake(0, 0, self.size.width * self.scale, self.size.height * self.scale);
UIEdgeInsets crop = [self transparencyInsetsByCuttingWhitespace:tolerance];

UIImage *img = self;

if (crop.top == 0 && crop.bottom == 0 && crop.left == 0 && crop.right == 0) {

// No cropping needed

} else {

// Calculate new crop bounds
rect.origin.x += crop.left;
rect.origin.y += crop.top;
rect.size.width -= crop.left + crop.right;
rect.size.height -= crop.top + crop.bottom;

// Crop it
CGImageRef newImage = CGImageCreateWithImageInRect([self CGImage], rect);

// Convert back to UIImage
img = [UIImage imageWithCGImage:newImage scale:self.scale orientation:self.imageOrientation];

CGImageRelease(newImage);
}

return img;
}

关于ios - 修整 UIImage 白色边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22099464/

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