gpt4 book ai didi

iphone - 如何创建空/空白 UIImage 或 CGImage 并操作其上的像素(Xcode)?

转载 作者:行者123 更新时间:2023-12-03 18:28:53 33 4
gpt4 key购买 nike

我有以下问题,但只能部分解决。我正在使用 XCode 3.2.5,为 iOS 4+ 进行开发。

我只是尝试创建一个预定义大小的图像,操作其上的像素,然后在 UIImageView 中显示该图像。我的 View 由连接到的简单按钮和名为“buttonClicked”的 IBAction 以及名为“qrImage”并设置为“IBOutlet”的 UIImageView 组成。我使用以下代码:

头文件:myClassViewController.h

#import <UIKit/UIKit.h>

@interface myClassViewController : UIViewController
{
IBOutlet UIImageView *qrImage;
}

@property (nonatomic, retain) UIImageView *qrImage;

- (IBAction) buttonClicked;
- (UIImage*) drawQRImage;

@end

主文件myClassViewController.m

#import "myClassViewController.h"
#include <math.h>

@implementation myClassViewController
@synthesize qrImage;


-(UIImage*) drawQRImage
{
// load Image
//
UIImage *image = [UIImage imageNamed:@"blank.png"];
CGImageRef imageRef = image.CGImage;
NSData *data = (NSData *) CGDataProviderCopyData(CGImageGetDataProvider(imageRef));
char *pixels = (char *)[data bytes];

unsigned long int startPixel, pixelNr;


// manipulate the individual pixels
//
size_t width = CGImageGetWidth(imageRef);
size_t height = CGImageGetHeight(imageRef);

//
// [...] deleted some unimportant code here
//

pixelNr = 10;

int red = pixelNr*3;
int green = pixelNr*3+1;
int blue = pixelNr*3+2;

// Set Pixel-Color Black
//
pixels[red] = 0;
pixels[green] = 0;
pixels[blue] = 0;

//
// [...] deleted some unimportant code here
//

// create a new image from the modified pixel data
//
size_t bitsPerComponent = CGImageGetBitsPerComponent(imageRef);
size_t bitsPerPixel = CGImageGetBitsPerPixel(imageRef);
size_t bytesPerRow = CGImageGetBytesPerRow(imageRef);

CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, pixels, [data length], NULL);

CGImageRef newImageRef = CGImageCreate (
width,
height,
bitsPerComponent,
bitsPerPixel,
bytesPerRow,
colorspace,
bitmapInfo,
provider,
NULL,
false,
kCGRenderingIntentDefault
);

// the modified image
//
UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

// cleanup
//
free(pixels);
//CGImageRelease(imageRef); // DO NOT RELEASE OR ON NEXT RUN NSData GETS EXC_BAD_ACCESS
CGColorSpaceRelease(colorspace);
CGDataProviderRelease(provider);
CGImageRelease(newImageRef);

QRcode_free(qrCode);
QRinput_free(input);

[image release];

// return created Image
//
return newImage;
}


-(IBAction) buttonClicked
{
UIImage *createdUIImg = [self drawQRImage];
qrImage.image = createdUIImg;
}

我希望代码是不言自明的,如果不是这里有一个简短的描述:

A.单击按钮时,我调用方法drawQRImage,它将返回一个UIImage。B.在drawQRImage中我打开一个PNG文件,到目前为止它的大小为210x210并且只有白色背景。没有其他的。然后我操纵它上面的一些像素并将它们“漆成黑色”。当前代码应设置像素编号。 11 黑色。完成后,我返回新创建的图像。C. 然后,buttonClicked 方法将在 UIImageView 中显示此图像。

总而言之,其实很简单。它也(几乎)完美地工作。但现在我想做一些修改,但直到现在才让它们工作:

  1. 我必须返回的图像并不总是 210x210 像素,因此我必须能够更改大小。加载“空白”PNG 文件并操作它的像素是迄今为止我设法开始工作的唯一解决方法。一种更优雅的方法是创建一个具有所需大小的白色 BG 的空白图像,我可以在当前的方法中使用。不幸的是我还没有找到关于这个主题的任何内容。仅在操作现有图像上的像素时。这就是我想出当前解决方法的方法。我已经尝试过通过以下链接调整大小的剪裁:Resizing a UIImage the right way

  2. 按钮可以点击多次,绘制的像素也会改变。我现在的问题是,我似乎有内存泄漏,因为我注释掉了该行

    //CGImageRelease(imageRef);

但是如果我确实释放了 UIImageRef“imageRef”,那么再次单击该按钮时我将收到 EXC_BAD_ACCESS-Error 。所以我知道这意味着我尝试访问一个已经释放的对象。但我该如何解决这个问题,我不确定我是否一切都正确。我认为 imageRef 将在方法“drawQRImage”的开头重新创建,因此当我再次调用该方法时释放它应该不是问题。但看来我错了。

感谢您的每一点帮助!

最佳答案

以下讨论涉及 CGImage 对象的内存管理: Releasing CGImage (CGImageRef)

关于空白图片问题: Drawing into CGImageRef

关于iphone - 如何创建空/空白 UIImage 或 CGImage 并操作其上的像素(Xcode)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5771501/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com