gpt4 book ai didi

cocoa - PNG 到 NSImage 并返回会导致接近透明的锯齿

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

我正在 Cocoa 应用程序中调整一些 PNG 文件的大小。这些文件最终由另一个应用程序作为 OpenGL 纹理加载,并应用了编写不佳的着色器,该着色器在某一时刻执行以下操作:

texColor = mix(constant,vec4(texColor.rgb/texColor.a,texColor.a),texColor.a);

除以 alpha 不是一个好主意,解决方案是确保该步骤中 texColor 的 RGB 分量永远不会超过 1。但是!出于好奇:

令人惊讶的是,原始 PNG(在 GIMP 中创建)工作得很好,使用 GIMP 创建的调整大小的版本也工作得很好。但是,使用下面的代码调整文件大小会导致纹理在任何透明像素附近出现锯齿,即使 percent1.0 也是如此。知道我无意中更改这些图像突然导致着色器错误出现的原因是什么吗?

NSImage* originalImage = [[NSImage alloc] initWithData:[currentFile regularFileContents]];
NSSize newSize = NSMakeSize([originalImage size].width * percent, [originalImage size].height * percent);
NSImage* resizedImage = [[NSImage alloc] initWithSize:newSize];
[resizedImage lockFocus];
[originalImage drawInRect:NSMakeRect(0,0,newSize.width,newSize.height)
fromRect:NSMakeRect(0,0,[originalImage size].width, [originalImage size].height)
operation:NSCompositeCopy fraction:1.0];
[resizedImage unlockFocus];

NSBitmapImageRep* bits = [[[NSBitmapImageRep alloc] initWithCGImage:[resizedImage CGImageForProposedRect:nil context:nil hints:nil]] autorelease];
NSData* data = [bits representationUsingType:NSPNGFileType properties:nil];
NSFileWrapper* newFile = [[[NSFileWrapper alloc] initRegularFileWithContents:data] autorelease];

[newFile setPreferredFilename:currentFilename];
[folder removeFileWrapper:currentFile];
[folder addFileWrapper:newFile];

[originalImage release];
[resizedImage release];

最佳答案

在进行此类调整大小操作时,我通常将图像插值设置为高。这可能是您的问题。

[resizedImage lockFocus];
[NSGraphicsContext saveGraphicsState];
[[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
[originalImage drawInRect:...]
[NSGraphicsContext restoreGraphicsState];
[resizedImage unlockFocus];
<小时/>

另一件事要确保你正在做,尽管它可能没有帮助(见下文):

[[NSGraphicsContext currentContext] setShouldAntialias:YES];

这可能无法修复它,因为在不知道目标背景的情况下无法消除锯齿。但它仍然可能有帮助。如果这是问题所在(您无法尽快消除锯齿),您可能必须在准备绘制最终图像时合成此调整大小。

关于cocoa - PNG 到 NSImage 并返回会导致接近透明的锯齿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10776997/

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