在NSImage和Leptonica Pix之间转换

时间:2012-12-17 22:37:08

标签: objective-c cocoa nsimage leptonica

我正在开发一个Cocoa OS X程序来清理已扫描的页面,并希望使用Leptonica's library来完成繁重的工作。我在this postthis onethis one中找到了一些信息。我当然可以从NSImage获得CGImage,并可以将数据写入Leptonica Pix图像。我遇到的问题是,我的图像出现的75%的时间都是用理发店杆型模式扭曲的(从图像的顶部到底部的每个连续的像素行向右移动得越来越远)。有时虽然画面很好。我认为我在设置图像数据方面做错了,但这并不是我的强项,所以我无法理解这个问题。我正在使用以下代码创建Pix图像:

CGImageRef myCGImage = [processedImage CGImageForProposedRect:NULL context:NULL hints:NULL];
CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider(myCGImage));
const UInt8 *imageData = CFDataGetBytePtr(data);

Pix *myPix = (Pix *) malloc(sizeof(Pix));
myPix->w = (int)CGImageGetWidth (myCGImage);
myPix->h = (int)CGImageGetHeight (myCGImage);
myPix->d = (int)CGImageGetBitsPerPixel(myCGImage);
myPix->wpl =  ((CGImageGetWidth (myCGImage)*CGImageGetBitsPerPixel(myCGImage))+31)/32;
myPix->informat = IFF_TIFF;
myPix->data = (l_uint32 *) imageData;
myPix->colormap = NULL;

pix结构定义如下:

/*-------------------------------------------------------------------------*
 *                              Basic Pix                                  *
 *-------------------------------------------------------------------------*/
struct Pix
{
uint32             w;           /* width in pixels                   */
uint32             h;           /* height in pixels                  */
uint32             d;           /* depth in bits                     */
uint32             wpl;         /* 32-bit words/line                 */
uint32             refcount;    /* reference count (1 if no clones)  */
int              xres;        /* image res (ppi) in x direction    */
                                  /* (use 0 if unknown)                */
int              yres;        /* image res (ppi) in y direction    */
                                  /* (use 0 if unknown)                */
int              informat;    /* input file format, IFF_*          */
char                *text;        /* text string associated with pix   */
struct PixColormap  *colormap;    /* colormap (may be null)            */
uint32            *data;        /* the image data                    */
};

1 个答案:

答案 0 :(得分:0)

“理发店极型模式”是每行像素数据具有错误字节数的经典标志。

您应该wpl基于CGImageGetBytesPerRow返回的值。最有可能的是:

myPix->wpl = CGImageGetBytesPerRow(myCGImage) / 4;

有几个原因导致图像的每行字节数与基于CGImageGetWidth()的猜测不同。例如,出于性能原因,可能会将其四舍五入,或者图像可能是更宽图像的子图像。