Eli*_*TUM 11 iphone xcode pixel uiimage cgimage
我有以下问题,只能部分解决它.我正在使用XCode 3.2.5,为iOS 4+开发.
我只是尝试创建一个预定义大小的图像,操纵它上面的像素,然后在UIImageView中显示图像.我的观点包括连接到的简单Button和名为"buttonClicked"的IBAction以及名为"qrImage"的UIImageView,并设置为"IBOutlet".我使用以下代码:
头文件:myClassViewController.h
#import <UIKit/UIKit.h>
@interface myClassViewController : UIViewController
{
IBOutlet UIImageView *qrImage;
}
@property (nonatomic, retain) UIImageView *qrImage;
- (IBAction) buttonClicked;
- (UIImage*) drawQRImage;
@end
Run Code Online (Sandbox Code Playgroud)
Main-File 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;
}
Run Code Online (Sandbox Code Playgroud)
我希望代码是非常自我解释的,如果不是这里的简短描述:
A. On Button-Click我调用drawQRImage方法,它将返回一个UIImage.B.在drawQRImage内部我打开一个PNG文件,直到现在它的大小为210x210,只有白色背景.没有其他的.然后我操纵它上面的一些像素并"将它们涂成黑色".当前代码应设置像素nr.11黑色.完成后,我返回新创建的图像.C.方法buttonClicked将在UIImageView中显示此Image.
总而言之,非常简单.它也可以(几乎)完美地工作.但现在我想做一些修改,但直到现在才能让它们工作:
我必须返回的图像并不总是210x210像素,所以我必须能够改变大小.加载一个"空白"PNG文件并操纵它的像素是唯一的解决方法,直到现在我设法开始工作.一种更优雅的方式是创建一个空白图像,其中白色BG具有所需尺寸,我可以在我当前的方法中使用.不幸的是我还没有找到关于这个主题的任何内容.仅在操纵现有图像上的像素时.这就是我想出当前的解决方法.我已经尝试通过以下链接调整剪切大小:以正确的方式调整UIImage的大小
可以多次单击该按钮,绘制的像素也将更改.我现在的问题是,我似乎有内存泄漏,因为我注释掉了这条线
// CGImageRelease(imageRef);
但是如果我确实发布了UIImageRef"imageRef",再次点击按钮时会出现EXC_BAD_ACCESS-Error.所以我知道这意味着我尝试访问已经发布的对象.但是我怎么能解决这个问题,我不确定我是否在这里得到了一切.我认为imageRef将在方法"drawQRImage"的开头新创建,因此当我再次调用该方法时,释放它应该不是问题.但看起来我好像错了.
感谢所有的帮助!
| 归档时间: |
|
| 查看次数: |
20269 次 |
| 最近记录: |