大佬教程收集整理的这篇文章主要介绍了macos – NSImage和视网膜显示混乱,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
-(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 *trans = [[[NSAffineTransform alloc] init] autorelease]; [trans set];
我不知道它是否是一个错误,或者它的工作方式.
以上是大佬教程为你收集整理的macos – NSImage和视网膜显示混乱全部内容,希望文章能够帮你解决macos – NSImage和视网膜显示混乱所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。