On Nov 14, 2009, at 1:01 PM, R T wrote:

> I'm using... vImage_Error err = vImageContrastStretch_Planar8 (&src, &dest, 
> flags  );
> 
> and getting a scrambled image from the code? Each pixel returned is at the 
> right height but offset left 3 pixels. Anyone wanting to you to look the 
> images email me.
> 
> - (NSImage*)vImageContrastStretch:(NSImage*)anImage{
> NSBitmapImageRep *anImageRep = [[NSBitmapImageRep alloc] 
> initWithData:[anImage TIFFRepresentation]];

TIFFRepresentation is slow.  Here you'd be better off to choose a fixed pixel 
format and draw the NSImage into a new NSBitmapImageRep that you control.  This 
will almost certainly bite you later on...especially if you switch 
architectures and the order changes from ARGB to RGBA.

> unsigned char *inBytes = [anImageRep bitmapData];
> NSSize imageSize = [anImage size];
> UInt32 imageWidth = imageSize.width;
> UInt32 imageHeight = imageSize.height;

Here you want to use pixelsWide and pixelsHigh, and note that they are typed 
NSInteger, not uint32_t.

> NSImage *newImage = [[[NSImage alloc] initWithSize:imageSize]autorelease];
> NSBitmapImageRep *newImageRep;
> UInt32 samplesPerPixel = [anImageRepsamplesPerPixel];
>        BOOL hasAlpha;
> if (samplesPerPixel==2 || samplesPerPixel==4) { // Gray+alpha or RGBA?
> hasAlpha = YES;
> } else {
> hasAlpha = NO;
> }
> NSString *colorSpaceName = nil;
> if (samplesPerPixel==1 || samplesPerPixel==2) { // Gray or Gray+alpha?
> colorSpaceName = NSCalibratedWhiteColorSpace;
> } else if (samplesPerPixel==3 || samplesPerPixel==4) { // RGB or RGBA?
> colorSpaceName = NSCalibratedRGBColorSpace;
> } else {NSLog(@"I can't handle a colorspace with %d samples per 
> pixel",samplesPerPixel);
> return nil;}
> newImageRep = [[[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
>       pixelsWide:imageWidth
>       pixelsHigh:imageHeight
>    bitsPerSample:8
> samplesPerPixel:samplesPerPixel
> hasAlpha:hasAlpha
> isPlanar:NO
>   colorSpaceName:colorSpaceName
>      bytesPerRow:0
>     bitsPerPixel:0] autorelease];
> unsigned char *outBytes = [newImageRep bitmapData];
> long numPixels = imageWidth * imageHeight;
> unsigned char *workBuffer1 = malloc(numPixels*sizeof(char));
> unsigned char *workBuffer2 = malloc(numPixels*sizeof(char));
> if (workBuffer1==NULL || workBuffer2==NULL) {NSLog(@"Can't allocate memory 
> for image ");
> return nil;}
> vImage_Flags flags = 1;

Use the named constant: kvImageLeaveAlphaUnchanged.

> int sampleIx;
> for (sampleIx=0; sampleIx<samplesPerPixel; sampleIx++) {
> int ix; for (ix=0; ix<numPixels; ix++) *(workBuffer1+ix) = *(inBytes + 
> ix*samplesPerPixel + sampleIx);
> 
> const vImage_Buffer src = { workBuffer1, imageHeight, imageWidth, 
> imageWidth*sizeof(char) };
> const vImage_Buffer dest = { workBuffer2, imageHeight, imageWidth, 
> imageWidth*sizeof(char) };
> 
> vImage_Error err = vImageContrastStretch_Planar8 (&src, &dest, flags  );

How are you avoiding stretching the alpha channel?  Shouldn't you skip it 
manually?

> if (err!=kvImageNoError) {return nil;}
> for (ix=0; ix<numPixels; ix++) *(outBytes + ix*samplesPerPixel + sampleIx) = 
> *(workBuffer2+ix);
> }

Since you passed 0 when creating the image rep, NSBitmapImageRep will pad rows 
as it sees fit.  You need to compute the start of each row using -bytesPerRow, 
which is likely producing the offset you see.

If you always created an ARGB image and set the image rep bytesPerRow parameter 
yourself (or ensure it's the same for source and destination), you could use 
vImageContrastStretch_ARGB8888 and fill out the vImage_Buffer of the source and 
destination using [imageRep bitmapData] as the buffer.  That would also avoid 
all of the copies you're doing.  Even better, look for a way to do this using 
Core Image; vImage is tricky to use with Cocoa graphics objects, in my opinion.

Sorry if I misread anything here...your indentation and bracket style isn't 
what I'm used to.


Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to