- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的应用程序中,我有一个主视图(及其 UIGraphicsGetCurrentContext())和其他几个 CGContextRef Canvas 。它们的尺寸均相同,即屏幕尺寸 - 无比例因子。
我在辅助 Canvas 上进行绘制,最后在辅助 Canvas 上使用 CGBitmapContextCreateImage 并在主 Canvas 上使用 CGContextDrawImage 进行绘制。
在视网膜显示屏上,结果很差,所有线条看起来都像素化。我应该如何处理视网膜显示器上的绘画?
以下是我用来将上下文绘制到主上下文的代码:
void CocoaGraphicsContext::drawContext(GraphicsContext* context, double x, double y, Box* cropBox, Matrix3D* matrix)
{
CGAffineTransform matInverted;
if (matrix != NULL)
{
CGAffineTransform transMat = CGAffineTransformMake(matrix->vx1, matrix->vy1, matrix->vx2, matrix->vy2, matrix->tx, matrix->ty);
matInverted = CGAffineTransformInvert(transMat);
CGContextConcatCTM(_cgContext, transMat);
}
CGImageRef cgImage = CGBitmapContextCreateImage(((CocoaGraphicsContext*)context)->cgContext());
CGContextSaveGState(_cgContext);
CGContextSetInterpolationQuality(_cgContext, kCGInterpolationNone);
bool shouldCrop = ((cropBox != NULL) && (cropBox->valid()));
if (shouldCrop)
{
CGContextClipToRect(_cgContext, CGRectMake(cropBox->x(), cropBox->y(), cropBox->width(), cropBox->height()));
}
CGContextDrawImage(_cgContext, CGRectMake(x, y, context->width(), context->height()), cgImage);
CGContextRestoreGState(_cgContext);
CGImageRelease(cgImage);
if (matrix != NULL)
{
CGContextConcatCTM(_cgContext, matInverted);
}
}
主要上下文是使用 UIView 类中的 UIGraphicsGetCurrentContext() 获取的
---- 已编辑 ---初始化代码:
void CocoaBitmapContext::init(double width, double height, unsigned int* data)
{
int bytesPerRow = width * 2 * VT_BITMAP_BYTES_PER_PIXEL;
if (data == NULL)
{
_dataOwner = true;
_data = (unsigned int*)malloc(bytesPerRow * height * 2);
}
else
{
_dataOwner = false;
_data = data;
}
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
_cgContext = CGBitmapContextCreate(_data,
width * 2,
height * 2,
VT_BITMAP_BITS_PER_COMPONENT,
bytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little);
CGContextConcatCTM(_cgContext, CGAffineTransformMakeScale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale));
CGContextSetShouldAntialias(_cgContext, false);
CGContextSetRGBStrokeColor(_cgContext, 0.0, 0.0, 0.0, 0.0);
CGColorSpaceRelease(colorSpace);
}
最佳答案
位图大小以像素为单位指定,而屏幕上的大小以磅为单位。您可以使用[UIScreen mainScreen].scale
获取屏幕的比例因子。这就是一个点有多少个像素。对于配备视网膜显示屏的设备,该值将为 2。您需要按该系数缩放 Canvas 的大小。您还应该在创建上下文后立即连接比例变换。当您绘制图像时,您仍然应该使用屏幕边界作为目标矩形(比例变换负责缩放)。
CGSize canvasSize = [UIScreen mainScreen].bounds.size;
CGFloat scale = [UIScreen mainScreen].scale;
canvasSize.width *= scale;
canvasSize.height *= scale;
UIGraphicsBeginImageContext(canvasSize);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextConcatCTM(context, CGAffineTransformMakeScale(scale, scale));
...
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
如果要在 ImageView 中显示它,则 ImageView 应填满屏幕,并且其 contentMode
应为 UIViewContentModeScaleToFill
。
关于ios - 在 Retina 显示屏上的 CGContextRef 上绘画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17637840/
我正在尝试初始化 STM32F10B 主板上的 DT028ATFT-TS 显示屏。该系统之前可与 DT028TFT-TS 配合使用,但该显示器已停产。由于使用了新的显示器,接口(interface)也
使用一点计算机视觉,我想在有人走到设备前(距离 2 英尺)时打开壁挂式 Android 设备的显示屏。 我是一名经验丰富的开发人员,但我对计算机视觉几乎一无所知。以编程方式打开显示器非常简单。任何指导
我正在使用phoneGap为iPhone创建一个应用程序,但我确信它无法使用视网膜显示屏工作,而是使用旧的iPhone3分辨率。 使用phoneGap开发时有没有办法让iPhone有2个版本?这是一个
我正在使用 Cocoa Touch 开发 iPhone 应用程序。 我将货币金额以及 ISO 4217 货币代码列表中的相关货币代码存储在表中: 例如:123.45 英镑、456.45 美元、321.
有没有办法以编程方式将 Apple Watch 显示屏旋转 180 度?这将使佩戴 Apple Watch 的人能够调整 Apple Watch 显示屏的方向,以便站在佩戴 watch 的人对面的人更
开始游戏后,游戏不会使用整个 Android 屏幕。这种情况仅发生在游戏本身中,如图像所示,因为用户无法到达屏幕底部。已尝试找到解决方案,但我尝试过的所有尝试似乎都不起作用。不确定要提供哪个代码,因此
我正在使用 SDL2,现在在 iOS 和 iPhone 5S 上使用它时遇到一点问题。当我创建一个窗口时,SDL 将创建一个分辨率为 320x568 像素的窗口。如果我通过创建窗口使用 SDL_WIN
只是这个问题,我想在我的 MonoTouch 应用程序中检测视网膜显示。谢谢。 最佳答案 已经有 answers对于 ObjectiveC 但这是 C# 版本: bool retina = (UIS
我有一个 Quartz 2D 游戏,它直接绘制到上下文上。因此,我必须调整代码,以便它可以在适合视网膜显示屏的情况下进行缩放。我使用以下代码执行此操作: - (CGFloat) displayScal
所以我认为我很接近,但我碰壁了。这是我想要完成的:我有一个计算点击次数的程序,并且会在值更新时将串行数据发送到 Arduino (UNO)。 到目前为止,我有以下工作:- LED 显示屏上的滚动字幕(
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
如何以编程方式 (Objective-C) 确定 iPad 是否具有 Retina 显示屏? 最佳答案 if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceI
我正在开发一个具有大量 Assets 的应用程序。由于该应用程序同时具有 Retina 显示屏和正常分辨率的资源,因此我认为在开发结束时它将接近 2 GB。 是否可以发布一个支持 Retina 显示屏
我在互联网上哪里可以找到代码的 UI 元素来实现类似于 XCode 4 和 iTunes 中的 LCD 显示器。 XCode 4 中的比 iTunes 更先进一点,它提供了更多功能。 这是标准元素,还
2015 年 8 月 26 日编辑 好吧,这个问题可能有点粗糙,因为这个元素仍处于开发阶段,所以在法律上我还不能分享它来实时显示我的问题。 我遇到的问题是,我正在为客户构建站点,当我们开始测试阶段时,
我想单独在“Macbook Pro with Touchbar”上显示一些内容,并在其他台式机/笔记本电脑上隐藏相同的内容。 我知道使用媒体查询可以让我定位设备和像素比,但这里我试图定位支持触摸的笔记
我发现了一个 Swing 图像渲染错误,它只影响配备 Retina 显示屏的 Mac(TYPE_INT_ARGB_PRE BufferedImages 无法绘制)。我有一个有效的解决方法(改为使用 T
我已阅读Apple的“新闻和公告”如下: Using Identifiers in Your Apps March 21, 2013 Starting May 1, the App Store wil
iPhone4 和旧 iPhone 的图形开发在几个方面发生了变化: 介绍了点的概念替换像素。 UIImage 的方法将加载高用@2x解析资源文件在文件名中。 比例因子已添加到 UIScreen,UI
我的浏览器内 LED Display 对象在其 map 属性中存储了 LED 对象。每个 LED 都有 x 和 y 属性,以便知道它在 Canvas 上的位置,而 map 是一个 2D LED 数组(
我是一名优秀的程序员,十分优秀!