gpt4 book ai didi

cocoa - 请帮助 CGBitmapContext 和 16 位图像

转载 作者:行者123 更新时间:2023-12-03 16:29:53 26 4
gpt4 key购买 nike

我很想知道我在这里做错了什么。我是 CGImageRefs 的新手,所以任何建议都会有帮助。

我正在尝试创建一个位图图像,该图像的像素值是另一个位图像素的加权和,并且两个位图每个 channel 都是 16 位。出于某种原因,我可以毫无困难地让它在 8 位图像上工作,但在 16 位图像上却严重失败。我的猜测是我只是没有正确设置。我尝试过使用 CGFloats、float 和 UInt16s 作为数据类型,但没有任何效果。输入图像没有 Alpha channel 。我得到的输出图像看起来像彩色的雪。

标题中的相关内容:

UInt16 *inBaseAddress;
UInt16 *outBaseAddress;
CGFloat inAlpha[5];
CGFloat inRed[5];
CGFloat inGreen[5];
CGFloat inBlue[5];
CGFloat alphaSum, redSum, greenSum, blueSum;
int shifts[5];
CGFloat weight[5];
CGFloat weightSum;

我使用以下方法创建输入位图的上下文(使用 CGImageSourceCreateImageAtIndex(source, 0, NULL) 创建的 CGImageRef):

size_t width = CGImageGetWidth(inBitmap);
size_t height = CGImageGetHeight(inBitmap);
size_t bitmapBitsPerComponent = CGImageGetBitsPerComponent(inBitmap);
size_t bitmapBytesPerRow = (pixelsWide * 4 * bitmapBitsPerComponent / 8);
CGColorSpaceRef colorSpace = CGImageGetColorSpace(inImage);

CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaNoneSkipLast;


CGContextRef inContext = CGBitmapContextCreate (NULL,width,height,bitmapBitsPerComponent,bitmapBytesPerRow,colorSpace,bitmapInfo);

输出位图的上下文以相同的方式创建。我使用以下方法将 inBitmap 绘制到 inContext 中:

CGRect rect = {{0,0},{width,height}}; 
CGContextDrawImage(inContext, rect, inBitmap);

然后我像这样初始化 inBaseAddress 和 outBaseAddress:

inBaseAddress = CGBitmapContextGetData(inContext);
outBaseAddress = CGBitmapContextGetData(outContext);

然后我用 inBaseAddress 中的值填充 outBaseAddress:

for (n = 0; n < 5; n++)
{
inRed[n] = inBaseAddress[inSpot + 0 + shifts[n]];
inGreen[n] = inBaseAddress[inSpot + 1 + shifts[n]];
inBlue[n] = inBaseAddress[inSpot + 2 + shifts[n]];
inAlpha[n] = inBaseAddress[inSpot + 3 + shifts[n]];

}

alphaSum = 0.0;
redSum = 0.0;
greenSum = 0.0;
blueSum = 0.0;

for (n = 0; n < 5; n++)
{
redSum += inRed[n] * weight[n];
greenSum += inGreen[n] * weight[n];
blueSum += inBlue[n] * weight[n];
alphaSum += inAlpha[n] * weight[n];

}

outBaseAddress[outSpot + 0] = (UInt16)roundf(redSum);
outBaseAddress[outSpot + 1] = (UInt16)roundf(greenSum);
outBaseAddress[outSpot + 2] = (UInt16)roundf(blueSum);
outBaseAddress[outSpot + 3] = (UInt16)roundf(alphaSum);

作为一个简单的检查,我尝试过:

outBaseAddress[outSpot + 0] = inBaseAddress[inSpot + 0];
outBaseAddress[outSpot + 1] = inBaseAddress[inSpot + 1];
outBaseAddress[outSpot + 2] = inBaseAddress[inSpot + 2];
outBaseAddress[outSpot + 3] = inBaseAddress[inSpot + 3];

它有效,并且至少意味着指向位图数据的上下文和指针正在工作。

感谢您的任何意见。这非常令人沮丧,因为它在 8 位图像上运行得很好。

最佳答案

好的,我已经弄清楚了。我需要将 16 位 图像的 bitmapInfo 设置为 kCGBitmapByteOrder16Little,将 8bit 图像的 bitmapInfo 设置为 kCGBitmapByteOrder32Little。我对此感到有点惊讶,因为我本来以为会是相反的情况(16 位为 32Little,8 位为 16Little)。

我还需要将指向位图的指针键入为 UInt8*UInt16*。看来我还必须在 bitmapContext 中包含一个 Alpha channel 。我不知道为什么,但如果没有它,返回的上下文总是为零。

关于cocoa - 请帮助 CGBitmapContext 和 16 位图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3974484/

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