Posts

Post marked as solved
3 Replies
2.2k Views
I try to write ToneCurveFilter using CoreImage. I have curves data in RGB image. Size of the RGB image with curves data is 256*1. Every pixel presents curve value. For example, for red = 200, you should get pixel with coordinates (200, 0) and get red channel from this pixel.Image: http://i.stack.imgur.com/Njhr6.pngI exam colour of every pixel in the curve image, and they are correct. (Identical values, result filter shouldn't change image colour)Also I write a kernel for the filter: kernel vec4 coreImageKernel(uniform sampler src, __table sampler toneCurveData) { vec4 color = unpremultiply(sample(src, samplerCoord(src))); //return vec4(color.r, color.g, color.b, 1.0); vec2 redPointPosition = samplerTransform(toneCurveData, vec2(color.r * 255.0, 0.5)); float red = (sample(toneCurveData, redPointPosition)).r; vec2 greenPointPosition = samplerTransform(toneCurveData,vec2(color.g * 255.0, 0.5)); float green = (sample(toneCurveData, greenPointPosition)).g; vec2 bluePointPosition = samplerTransform(toneCurveData,vec2(color.b * 255.0, 0.5)); float blue = (sample(toneCurveData, bluePointPosition)).b; vec4 resultColor = vec4(red, green, blue, color.a); return premultiply(resultColor); }I expect that this filter, will not change my source image. But a result image is more darker then the original image. I've tried change color.x * 255.0 to concreate value, for example to 230.0, but color of the result image was (224, 223, 224). And I do not understand why.To test my kernels I use "Quartz Composer" -- very useful tool.I've tried add ROI function, but this is not helped for me. function myROIFunction(samplerIndex, dstRect, __image info) { __vec4 dstRectResult = dstRect; if(samplerIndex == 1) { dstRectResult = info.extent; } return dstRectResult; } function __image main(__image src, __image toneCurveData, __color monohromeColor, __number power) { coreImageKernel.ROIHandler = myROIFunction; return coreImageKernel.apply(src.definition, toneCurveData, src, toneCurveData, monohromeColor, power); }I think problem in coordinate space of toneCurveData sample, but I can't understand what exactly.Main question: how get a pixel colour from toneCurveData for some pixel (for example, for pixel with coordinates (255.0, 0.0), it should be (255.0, 255.0, 255.0))?Also I've tryed use a NSData object with toneCurve data as parameter of the kernel, this's not helped me.
Posted
by k_be.
Last updated
.