我知道图像在视网膜设备上默认放大,但默认缩放会使图像模糊。
我想知道是否有一种方法可以在最近邻模式下缩放它,其中没有创建透明像素,而是每个像素乘以 4,所以它看起来像在非视网膜设备上。
我正在谈论的示例可以在下图中看到。 示例 http://cclloyd.com/downloads/sdfsdf.png
我知道图像在视网膜设备上默认放大,但默认缩放会使图像模糊。
我想知道是否有一种方法可以在最近邻模式下缩放它,其中没有创建透明像素,而是每个像素乘以 4,所以它看起来像在非视网膜设备上。
我正在谈论的示例可以在下图中看到。 示例 http://cclloyd.com/downloads/sdfsdf.png
CoreGraphics 不会做这样的 2 倍缩放,您需要编写一些显式的像素映射逻辑来做这样的事情。以下是我用来执行此操作的一些代码,您当然需要填写详细信息,因为它对像素的输入缓冲区进行操作,并写入 2 倍大的像素输出缓冲区。
// Use special case "DOUBLE" logic that will simply duplicate the exact
// RGB value from the indicated pixel into the 2x sized output buffer.
int numOutputPixels = resizedFrameBuffer.width * resizedFrameBuffer.height;
uint32_t *inPixels32 = (uint32_t*)cgFrameBuffer.pixels;
uint32_t *outPixels32 = (uint32_t*)resizedFrameBuffer.pixels;
int outRow = 0;
int outColumn = 0;
for (int i=0; i < numOutputPixels; i++) {
if ((i > 0) && ((i % resizedFrameBuffer.width) == 0)) {
outRow += 1;
outColumn = 0;
}
// Divide by 2 to get the column/row in the input framebuffer
int inColumn = outColumn / 2;
int inRow = outRow / 2;
// Get the pixel for the row and column this output pixel corresponds to
int inOffset = (inRow * cgFrameBuffer.width) + inColumn;
uint32_t pixel = inPixels32[inOffset];
outPixels32[i] = pixel;
//fprintf(stdout, "Wrote 0x%.10X for 2x row/col %d %d (%d), read from row/col %d %d (%d)\n", pixel, outRow, outColumn, i, inRow, inColumn, inOffset);
outColumn += 1;
}
当然,这段代码取决于您创建像素缓冲区,然后将其包装回 CFImageRef。但是,您可以轻松找到所有代码来执行此类操作。