CSS   发布时间:2022-04-17  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了macos – NSImage和视网膜显示混乱大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在NS Image上添加十字架,这是我的代码:
-(NSSizE)convertPixelSizeToPointSize:(NSSizE)px
{
    CGFloat displayScale = [[NSScreen mainScreen] BACkingScaleFactor];
    NSSize res;
    res.width = px.width / displayScale;
    res.height = px.height / displayScale;
    return res;
}

-(void)awakeFromNib
{
    CGFloat scale = [[NSScreen mainScreen] BACkingScaleFactor];

    NSLog(@"BACkingScaleFactor : %f",scalE);

    NSImage *img = [[[NSImage alloc]initWithContentsOfFile:@"/Users/support/Pictures/cat.JPG"] autorelease];


    NSBitmapImageRep *imgRep = [NSBitmapImageRep imageRepWithData:[img TIFFRepresentation]];
    NSSize imgPixelSize = NsmakeSize([imgRep pixelsWide],[imgRep pixelsHigh]);
    NSSize imgPointSize = [self convertPixelSizeToPointSize:imgPixelSize];
    [img setSize:imgPointSize];

    NSLog(@"imgPixelSize.width: %f,imgPixelSize.height:%f",imgPixelSize.width,imgPixelSize.height);
    NSLog(@"imgPointSize.width: %f,imgPointSize.height:%f",imgPointSize.width,imgPointSize.height);

    [img lockFocus];
    NSAffineTransform *trans = [[[NSAffineTransform alloc] init] autorelease];
    [trans scaleBy:1.0 / scale];
    [trans set];

    NSBezierPath *path = [NSBezierPath bezierPath];     
    [[NSColor redColor] setStroke];
    [path moveToPoint:NsmakePoint(0.0,0.0)];
    [path lineToPoint:NsmakePoint(imgPixelSize.width,imgPixelSize.height)];
    [path moveToPoint:NsmakePoint(0.0,imgPixelSize.height)];
    [path lineToPoint:NsmakePoint(imgPixelSize.width,0.0)];

    [path setLineWidth:1];
    [path stroke];
    [img unlockFocus];

    [imageView setImage:img];

    imgRep = [NSBitmapImageRep imageRepWithData:[img TIFFRepresentation]];
    NSData *imageData = [imgRep representationUsingType:NSJPEGFileType properties:nil];
    [imageData writeToFile:@"/Users/support/Pictures/11-5.JPG" atomically:NO];
}

在非视网膜显示器上,结果是:

和控制台显示:

2012-07-06 00:53:09.889 ReTinaTest[8074:403] BACkingScaleFactor : 1.000000
2012-07-06 00:53:09.901 ReTinaTest[8074:403] imgPixelSize.width: 515.000000,imgPixelSize.height:600.000000
2012-07-06 00:53:09.902 ReTinaTest[8074:403] imgPointSize.width: 515.000000,imgPointSize.height:600.000000

但在视网膜显示器上(我没有使用真正的视网膜显示器而是hidpi模式):

安慰:

2012-07-06 00:56:05.071 ReTinaTest[8113:403] BACkingScaleFactor : 2.000000
2012-07-06 00:56:05.083 ReTinaTest[8113:403] imgPixelSize.width: 515.000000,imgPixelSize.height:600.000000
2012-07-06 00:56:05.084 ReTinaTest[8113:403] imgPointSize.width: 257.500000,imgPointSize.height:300.000000

如果我省略这些行:

NSAffineTransform *trans = [[[NSAffineTransform alloc] init] autorelease];
            [trans scaleBy:1.0 / scale];
            [trans set];

但是,如果我将[NSAffineTransform scaleBy]更改为1.0,结果是正确的

NSAffineTransform *trans = [[[NSAffineTransform alloc] init] autorelease];
        [trans scaleBy:1.0];
        [trans set];

安慰:

2012-07-06 01:01:03.420 ReTinaTest[8126:403] BACkingScaleFactor : 2.000000
2012-07-06 01:01:03.431 ReTinaTest[8126:403] imgPixelSize.width: 515.000000,imgPixelSize.height:600.000000
2012-07-06 01:01:03.432 ReTinaTest[8126:403] imgPointSize.width: 257.500000,imgPointSize.height:300.000000

请问有人可以解释一下吗?隐藏模式是否与视网膜显示不同?

解决方法

我想我找到了答案.如果NSAffineTransform设置为NSImage的上下文,它会将坐标系转换为像素尺寸,即2 x点尺寸.即使它像这样是空的:
NSAffineTransform *trans = [[[NSAffineTransform alloc] init] autorelease];
[trans set];

我不知道它是否是一个错误,或者它的工作方式.

大佬总结

以上是大佬教程为你收集整理的macos – NSImage和视网膜显示混乱全部内容,希望文章能够帮你解决macos – NSImage和视网膜显示混乱所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。