Retina デバイスではデフォルトで画像がアップスケールされることは知っていますが、デフォルトのスケーリングでは画像がぼやけてしまいます。
透明なピクセルが作成されず、各ピクセルが 4 倍される最近傍モードでスケーリングする方法があるかどうか疑問に思っていたので、非網膜デバイスのように見えます。
私が話していることの例は、下の画像で見ることができます。 例 http://cclloyd.com/downloads/sdfsdf.png
Retina デバイスではデフォルトで画像がアップスケールされることは知っていますが、デフォルトのスケーリングでは画像がぼやけてしまいます。
透明なピクセルが作成されず、各ピクセルが 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 にラップすることに依存しています。しかし、そのようなことを行うためのすべてのコードを簡単に見つけることができます。