使用CGContextRef在大尺寸图像上绘制线条后,在iPad中接收内存警告

时间:2015-01-29 04:51:44

标签: ios objective-c uiimageview uiimage

我使用CGContextRef在UIImage上绘制线条。我的图像分辨率非常大,如3000x4500.如果我绘制一条线但是如果我要绘制多条线,那么它不会给我内存警告发出内存警告,然后我的应用程序崩溃。想要释放CGContextRef对象但是出错了。我的代码:

UIGraphicsBeginImageContext(imageView.image.size);

[imageView.image drawAtPoint:CGPointMake(0, 0)];


context2=UIGraphicsGetCurrentContext(); 
for(int i=0; i<kmtaObject.iTotalSize; i++)
    {
        kmtaGroup=&kmtaObject.KMTA_GROUP_OBJ[i];

        //NSLog(@"Group  # = %d",i);

        for (int j=0; j<kmtaGroup->TotalLines; j++)
        {

            lineObject=&kmtaGroup->Line_INFO_OBJ[j];

           // NSLog(@"Line # = %d",j);
           // NSLog(@"*****************");
            x0 = lineObject->x0;
            y0= lineObject->y0;
            x1= lineObject->x1;
            y1= lineObject->y1;
            color= lineObject->Color;
            lineWidth= lineObject->LinkWidth;
            lineColor=[self add_colorWithRGBAHexValue:color];
            linearColor=lineColor;

            // Brush width
            CGContextSetLineWidth(context2, lineWidth);
            // Line Color
            CGContextSetStrokeColorWithColor(context2,[linearColor CGColor]);


            CGContextMoveToPoint(context2, x0, y0);

            CGContextAddLineToPoint(context2, x1, y1);
            CGContextStrokePath(context2);

        }
    }


    newImage=UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();
    imageView.image=newImage;

1 个答案:

答案 0 :(得分:1)

图像只需要54MB内存(3000 * 4500 * 4)。

由于一次只能显示一部分,因此请考虑将图像分成几个部分,例如Apple Maps中使用的地图图块。