0

スキャンしたページをクリーンアップするためにCocoaOSXプログラムに取り組んでおり、Leptonicaのライブラリを使用して手間のかかる作業を行いたいと考えています。私はこの投稿これ、そしてこれでいくつかの情報を見つけました。NSImageからCGImageを取得でき、LeptonicaPixイメージにデータを書き込むことができます。私が抱えている問題は、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                    */
};
4

1 に答える 1

0

「バーバー ショップ ポール タイプ パターン」は、ピクセル データの 1 行あたりのバイト数が間違っていることを示す典型的な兆候です。

wplによって返される値に基づく必要がありますCGImageGetBytesPerRow。最も可能性が高い:

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

画像の 1 行あたりのバイト数が に基づいた推測と異なる理由はいくつかありますCGImageGetWidth()。たとえば、パフォーマンス上の理由で切り上げられたり、画像が幅の広い画像のサブ画像になったりする場合があります。

于 2012-12-17T22:57:55.253 に答える