我按照Apple的 GLPaint 绘图应用程序尝试修改它。在示例代码中,他们使用简单的 particle.png 进行绘制。
我的问题是我想使用我选择的其他图像进行绘图。乍一看似乎很容易用某些<替换“particle.png” strong>“finger.png”但它没有用..当我用“finger.png”替换“particle.png”时,我得到了一些东西像这样:
我的“finger.png”图片看起来像这样:
部分代码:
- (id)initWithCoder:(NSCoder*)coder
{
CGSize myShadowOffset = CGSizeMake (0, 0);
NSMutableArray* recordedPaths;
CGImageRef brushImage;
CGContextRef brushContext;
GLubyte *brushData;
size_t width, height;
// Create a texture from an image
// First create a UIImage object from the data in a image file, and then extract the Core Graphics image
////--------------------Modification--------------------------------///////
brushImage = [UIImage imageNamed:@"finger.png"].CGImage;
////--------------------Modification--------------------------------///////
// Get the width and height of the image
width = CGImageGetWidth(brushImage);
height = CGImageGetHeight(brushImage);
NSLog(@"%f%f",(CGFloat)width, (CGFloat)height);
// Texture dimensions must be a power of 2. If you write an application that allows users to supply an image,
// you'll want to add code that checks the dimensions and takes appropriate action if they are not a power of 2.
// Make sure the image exists
if(brushImage)
{
// Allocate memory needed for the bitmap context
brushData = (GLubyte *) calloc(width * height * 4, sizeof(GLubyte));
// Use the bitmatp creation function provided by the Core Graphics framework.
brushContext = CGBitmapContextCreate(brushData, width, height, 8, width * 4, CGImageGetColorSpace(brushImage), kCGImageAlphaPremultipliedLast);
// After you create the context, you can draw the image to the context.
CGContextDrawImage(brushContext, CGRectMake(0.0, 0.0, (CGFloat)width, (CGFloat)height), brushImage);
// You don't need the context at this point, so you need to release it to avoid memory leaks.
CGContextRelease(brushContext);
// Use OpenGL ES to generate a name for the texture.
glGenTextures(1, &brushTexture);
// Bind the texture name.
glBindTexture(GL_TEXTURE_2D, brushTexture);
// Set the texture parameters to use a minifying filter and a linear filer (weighted average)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// Specify a 2D texture image, providing the a pointer to the image data in memory
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, brushData);
// Release the image data; it's no longer needed
free(brushData);
}
我不明白为什么我会这样画画。任何人都可以指出我需要做出哪些其他更改才能使此应用程序像以前一样工作?我不是OpenGL的专家,所以任何帮助或建议都将受到赞赏..
答案 0 :(得分:3)
如果我没记错的话,你必须把图像变成透明的白色才能使它工作。如果你的蓝色周围有透明度,它会将整个图片显示为不透明。
我选择了标准的Apple GLPaint应用程序。我用在Photoshop中制作的finger.png替换了particle.png。它是64x64 RGB 8位。整个图像是透明的,除了我直接从你的blue finger.png复制的白色污迹。这是模拟器中的输出:
答案 1 :(得分:0)
有点晚了,但我发现如果你在PaintingView.h中更改#define kBrushScale,你会得到有趣的效果。尝试更改为.25,.5。 .75 1.0等...