在Retina设备上升级图像

时间:2013-05-12 05:09:41

标签: image scale scaling retina

我知道在视网膜设备上默认图像是高档的,但默认缩放会使图像模糊。

我想知道是否有一种方法可以在最近邻模式下缩放它,其中没有创建透明像素,而是每个像素乘以4,所以它看起来就像在非视网膜设备上。

我在谈论的内容示例如下图所示。 example http://cclloyd.com/downloads/sdfsdf.png

1 个答案:

答案 0 :(得分:0)

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中。但是,你可以找到所有代码来轻松完成这类工作。