我正在尝试使用 libtiff 将 UIImage 写为 tiff。问题是,即使我将它写为每像素 1 位,当我期望更接近 100k 或更少的东西时,文件仍然在 2-5MB 范围内。
这就是我所拥有的。
- (void) convertUIImage:(UIImage *)uiImage toTiff:(NSString *)file withThreshold:(float)threshold {
TIFF *tiff;
if ((tiff = TIFFOpen([file UTF8String], "w")) == NULL) {
[[[UIAlertView alloc] initWithTitle:@"Error" message:[NSString stringWithFormat:@"Unable to write to file %@.", file] delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil] show];
return;
}
CGImageRef image = [uiImage CGImage];
CGDataProviderRef provider = CGImageGetDataProvider(image);
CFDataRef pixelData = CGDataProviderCopyData(provider);
unsigned char *buffer = (unsigned char *)CFDataGetBytePtr(pixelData);
CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(image);
CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(image);
size_t compBits …Run Code Online (Sandbox Code Playgroud) 由于我在尝试将混合滤镜应用于图像并显示它时遇到的崩溃,我感到头疼.我想要做的只是将叠加图像放到另一个图像上.
这是我的代码:
- (GPUImageOutput<GPUImageInput> *)myFilter
{
GPUImageFilterGroup *filtersGroup = [GPUImageFilterGroup new];
// Saturation
GPUImageSaturationFilter *saturationFilter = [GPUImageSaturationFilter new];
saturationFilter.saturation = 0.0;
[filtersGroup addFilter:saturationFilter];
// Noise
UIImage *noiseImage = [UIImage imageNamed:@"noise.png"];
GPUImagePicture *noisePicture = [[GPUImagePicture alloc] initWithImage:noiseImage];
GPUImageAddBlendFilter *blend = [GPUImageAddBlendFilter new];
[blend useNextFrameForImageCapture];
[filtersGroup addFilter:blend];
[noisePicture addTarget:blend atTextureLocation:1];
[noisePicture processImage];
[saturationFilter addTarget:blend];
filtersGroup.initialFilters = @[saturationFilter];
filtersGroup.terminalFilter = blend;
return filtersGroup;
}
Run Code Online (Sandbox Code Playgroud)
// Applying filter
GPUImageOutput <GPUImageInput> *effect = [self myFilter];
self._photoHandle = [[GPUImagePicture alloc] initWithImage:staticImage];
[self._photoHandle addTarget:effect];
[effect addTarget:self.targetPreviewView];
[self._photoHandle …Run Code Online (Sandbox Code Playgroud) 我正在使用 Android 的 GPUImage 库对位图应用一些效果。本质上,GPUImage接受位图并使用OpenGL ES,将1 x 1立方体渲染到位图大小的帧缓冲区中。用户可以编写自定义片段着色器来控制输出。
我正在尝试编写一个片段着色器,它在给定旋转角度的情况下旋转位图。这是我到目前为止所拥有的:
varying vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
uniform vec2 inputImageTextureSize;
uniform float angle;
const vec2 HALF = vec2(0.5);
void main()
{
float aSin = sin(angle);
float aCos = cos(angle);
vec2 tc = textureCoordinate;
tc -= HALF.xy;
tc *= mat2(aCos, aSin, -aSin, aCos);
tc += HALF.xy;
vec3 tex = texture2D(inputImageTexture, tc).rgb;
gl_FragColor = vec4(tex, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
它可以工作,但显然会扭曲位图(因为 GPUImage 视口设置为将 1 x 1 立方体映射到实际位图大小)。我不知道如何消除扭曲。我应该根据角度和 inputImageTextureSize 应用一些额外的缩放变换,但我未能获得正确的方程。StackOverflow 上的答案实际上都不适合我的情况。请帮忙!
谢谢!
嗨,GPUImage社区和Brad,
我想指定GPUImageMedianFilter和GPUImageGaussianBlurFilter的过滤器大小(半径).
是否需要指定GPU表示赞赏?或者可以通过GPUImage包装器完成吗?如果是这样,我该怎么做?
谢谢
我想要做的是,在OpenGL着色器中访问纹理的像素数据.之后,将它们的红色组件进行比较,以便我可以获得具有最大红色组件的像素的坐标.我可以用目标C,CPU处理能力来做到这一点.代码如下所示.
- (void)processNewPixelBuffer:(CVPixelBufferRef)pixelBuffer
{
short maxR = 0;
NSInteger x = -1, y = -1;
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
height = CVPixelBufferGetHeight(pixelBuffer);
width = CVPixelBufferGetWidth(pixelBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer);
uint8_t *src_buff = CVPixelBufferGetBaseAddress(pixelBuffer);
short** rawData = malloc(sizeof(short*) * height);
for (int i = 0; i < height; i++){
rawData[i] = malloc((sizeof(short) * width));
for (int j = 0; j < width; j++)
rawData[i][j] = (short)src_buff[(i + width * j) * 4];
}
for (int j = 0; j < height; j++)
for …Run Code Online (Sandbox Code Playgroud) 在https://github.com/luisespinoza/LEColorPicker项目上工作,我试图使用项目GPUImage(https://github.com/BradLarson/GPUImage)从任意输入UIImage生成直方图UIImage.
我正在使用的当前代码如下:
- (NSDictionary*)dictionaryWithColorsPickedFromImage:(UIImage *)image
{
GPUImageFilter *filter = [[GPUImageHistogramFilter alloc] initWithHistogramType:kGPUImageHistogramRGB];
UIImage *filteredImage = [filter imageByFilteringImage:image];
[UIImagePNGRepresentation(filteredImage) writeToFile:@"/Users/Luis/histogram.png" atomically:YES];
return nil;
}
Run Code Online (Sandbox Code Playgroud)
问题是histogram.png只为每个输入图像产生一条黑线.
那么,如何使用iOS GPUImage生成直方图UIImage的正确代码呢?
我试图在iPhoto应用程序中看到的单个视图中实现亮度,对比度和曝光滤镜.我试图建立组过滤器来做同样的事情.但它显示白色屏幕而不是修改图片.这是我申请的代码.
GPUImageFilterGroup *groupFilter = [[GPUImageFilterGroup alloc]init];
GPUImageBrightnessFilter *brightnessFilter = [[GPUImageBrightnessFilter alloc]init];
[brightnessFilter setBrightness:brightnessValue];
GPUImageContrastFilter *contrastFilter = [[GPUImageContrastFilter alloc]init];
[contrastFilter setContrast:contrastValue];
GPUImageExposureFilter *exposureFilter =[[GPUImageExposureFilter alloc]init];
[exposureFilter setExposure:exposureValue];
[groupFilter addFilter:brightnessFilter];
[groupFilter addFilter:contrastFilter];
[groupFilter addFilter:exposureFilter];
GPUImagePicture *stillImage= [[GPUImagePicture alloc]initWithImage:self.imageToModify];
[stillImage addTarget:groupFilter];
[stillImage processImage];
previewPicture.image = [groupFilter imageFromCurrentlyProcessedOutputWithOrientation:self.imageToModify.imageOrientation];
Run Code Online (Sandbox Code Playgroud)
我甚至尝试将每个单独放置但仍然显示白色图像.以上代码我使用的是正确的吗?我也试过使用GPUImageFilterPipeline而不是GPUImageFilterGroup但仍然有相同的问题.为了记录,图像是静止图像而不是实时馈送.
最近我正在提高我的OpenGL ES技能,查看GPUImage的源代码.当我正在阅读GPUImageContext该类的代码时,我得到它存储queue对它在库的其他部分中使用的引用.
例如,GPUImageView.m在队列中使用commonInitwith runSynchronouslyOnVideoProcessingQueue来执行一些与上下文不直接相关的操作(比如向着色器添加属性).
我的问题是为什么开发人员决定在"辅助"队列上执行这些操作,这是将这个队列存储到像这样的类中的好处GPUImageContext.
我知道这个问题与GPUImage框架严格相关,但我认为这可能是一个很好的机会来理解像Brad Larson这样熟练的开发人员如何决定构建iOS中最着名的图像处理库之一.
我希望我没有以好奇心冒犯作者.
我正在尝试使用GPUImage库为视频的每个帧添加图像,但无法使其工作.出于某种原因,处理后的视频仅包括原始视频,没有图像叠加.我究竟做错了什么?
GPUImagePicture *overlay = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"overlayimage"] smoothlyScaleOutput:YES];
[overlay processImage];
GPUImageMovie *movie = [[GPUImageMovie alloc] initWithURL:[THE URL TO THE VIDEO ASSET]];
movie.delegate = self;
movie.runBenchmark = YES;
movie.playAtActualSpeed = YES;
self.movieView = [[GPUImageView alloc] initWithFrame:self.bounds];
self.movieView.fillMode = kGPUImageFillModePreserveAspectRatio;
[self addSubview:self.movieView];
GPUImageAlphaBlendFilter *filter = [[GPUImageAlphaBlendFilter alloc] init];
[movie addTarget:filter atTextureLocation:0];
[overlay addTarget:filter atTextureLocation:1];
[filter prepareForImageCapture];
[filter addTarget:self.movieView];
[movie startProcessing];
Run Code Online (Sandbox Code Playgroud) 我正在使用GPUImage框架开发iOS项目.我不能让我的着色器得到遵守.
我的片段着色器中有一个函数:
const vec2 boundMin = vec2(0.0, 0.0);
const vec2 boundMax = vec2(1.0, 1.0);
bool inBounds (vec2 p) {
return all(lessThan(boundMin, p)) && all(lessThan(p, boundMax));
}
Run Code Online (Sandbox Code Playgroud)
着色器编译日志:
ERROR: 0:1: '_Bool' : syntax error syntax error
Run Code Online (Sandbox Code Playgroud)
当我替换所有调用函数
inBounds(vec2 p)
同
all(lessThan(boundMin, p)) && all(lessThan(p, boundMax))
它很棒!
问题:
OpenGL ES 2.0 Fragment Shader支持bool功能吗?如果是的话,我哪里出错了?如果不是,为什么会出现类似的功能all(),lessThan()等等.
环境:iPad mini,iOS 7,OpenGL ES 2.0,Xcode 5.0.2