繁体   English   中英

将矩阵转换为UIImage

[英]Convert matrix to UIImage

我需要将代表黑白图像的矩阵转换为UIImage。

例如:

这样的矩阵(只是表示形式)。 该图像将是符号“ +”

1 0 1

0 0 0

1 0 1

此矩阵表示黑白图像,其中黑色为0,白色为1。我需要将此矩阵转换为UIImage。 在这种情况下,宽度为3,高度为3

为了将矩阵转换为UIImage:

CGSize size = CGSizeMake(lines, columns);
UIGraphicsBeginImageContextWithOptions(size, YES, 0);

for (int i = 0; i < lines; i++)
{
    for (int j = 0; j < columns; j++)
    {
        // Choose color to draw 
        if ( matrixDraw[i*lines + j] == 1 ) {

            [[UIColor whiteColor] setFill];

        } else {

            // Draw black pixel
            [[UIColor blackColor] setFill];            
        }

        // Draw just one pixel in i,j
        UIRectFill(CGRectMake(i, j, 1, 1)); 

    }
}

// Create UIImage with the current context that we have just created
UIImage *imageFinal = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

基本上我们正在做的是:

  1. 用图像的大小创建上下文

  2. 循环查看每个像素的值。 黑色是0,白色是1。因此,取决于值,我们设置颜色。

  3. 最重要的功能:

      UIRectFill(CGRectMake(i,j,1,1)); 

这个函数让我们用宽度和高度填充i,j位置的像素(两种情况都填充一个像素)

  1. 最后,我们使用当前上下文创建一个UIImage,然后调用完成图像上下文。

希望它能对某人有所帮助!

我使用这种方法为“人生游戏”应用创建图像。 相对于绘制图形上下文而言,其优势在于速度非常快。

这都是很久以前写的,所以比我现在做的要混乱一些,但是方法将保持不变。 由于某些原因,我在方法之外定义了这些...

{
    unsigned int length_in_bytes;
    unsigned char *cells;
    unsigned char *temp_cells;
    unsigned char *changes;
    unsigned char *temp_changes;
    GLubyte *buffer;
    CGImageRef imageRef;
    CGDataProviderRef provider;
    int ar, ag, ab, dr, dg, db;
    float arf, agf, abf, drf, dgf, dbf, blah;
}

您将不需要所有这些图像。

方法本身...

- (UIImage*)imageOfMapWithDeadColor:(UIColor *)deadColor aliveColor:(UIColor *)aliveColor
{
    //translate colours into rgb components
    if ([deadColor isEqual:[UIColor whiteColor]]) {
        dr = dg = db = 255;
    } else if ([deadColor isEqual:[UIColor blackColor]]) {
        dr = dg = db = 0;
    } else {
        [deadColor getRed:&drf green:&dgf blue:&dbf alpha:&blah];

        dr = drf * 255;
        dg = dgf * 255;
        db = dbf * 255;
    }

    if ([aliveColor isEqual:[UIColor whiteColor]]) {
        ar = ag = ab = 255;
    } else if ([aliveColor isEqual:[UIColor blackColor]]) {
        ar = ag = ab = 0;
    } else {
        [aliveColor getRed:&arf green:&agf blue:&abf alpha:&blah];

        ar = arf * 255;
        ag = agf * 255;
        ab = abf * 255;
    }

//    dr = 255, dg = 255, db = 255;
//    ar = 0, ag = 0, ab = 0;

    //create bytes of image from the cell map
    int yRef, cellRef;

    unsigned char *cell_ptr = cells;

    for (int y=0; y<self.height; y++)
    {
        yRef = y * (self.width * 4);

        int x = 0;
        do
        {
            cellRef = yRef + 4 * x;

            if (*cell_ptr & 0x01) {
                //alive colour
                buffer[cellRef] = ar;
                buffer[cellRef + 1] = ag;
                buffer[cellRef + 2] = ab;
                buffer[cellRef + 3] = 255;
            } else {
                //dead colour
                buffer[cellRef] = dr;
                buffer[cellRef + 1] = dg;
                buffer[cellRef + 2] = db;
                buffer[cellRef + 3] = 255;
            }
            cell_ptr++;
        } while (++x < self.width);
    }

    //create image
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    // render the byte array into an image ref
    imageRef = CGImageCreate(self.width, self.height, 8, 32, 4 * self.width, colorSpace, kCGBitmapByteOrderDefault, provider, NULL, NO, kCGRenderingIntentDefault);

    // convert image ref to UIImage
    UIImage *image = [UIImage imageWithCGImage:imageRef];

    CGImageRelease(imageRef);
    CGColorSpaceRelease(colorSpace);

    //return image
    return image;
}

您应该能够对此进行调整,以便根据矩阵创建图像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM