2012-01-26 24 views
0

iOSアプリケーションでLeptonicaライブラリを使用して画像を処理したいと考えています。LeptonicaのPix構造からUIImageを作成する

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

は、誰もが、私はLeptonicaのPix構造に生データからUIImage作成することができます方法を知っていますか?

ありがとうございます!

答えて

0

まず、あなたがチェックアウトすることがあります:Convert Leptonica Pix Object to QPixmap (or other image object)

私たちがしたいことは、そのピックスとUIImageの両方をサポート一般的なフォーマットを見つけるピックスからその共通フォーマットに変換した後、UIImageに共通フォーマットから変換することです。

Leptonicaライブラリを見ると、一般的にサポートされているフォーマットはGIF、JPEG、TIFF、BMP、PNGのようです。 JPEGは不可逆であり、GIFとPNGはどちらもCPUによる追加作業になります(PixからUIImageに変換するとエンコード/デコードサイクルが追加されます)。これらの理由から、私は以下の例でTIFFを選択しました。それが動作しない場合、私はPNGに行くだろう。

  • 1)のNSData
  • 3にバイトバッファ
  • 2)バイトのバッファを取り、それを格納するようにPIXへ変換)NSImageではにそのデータを渡す次のよう

    計画であります

pixWriteMem()関数は#1に必要なものです(ライブラリへのサポートがコンパイルされていれば)。

ライブラリに含まれているサンプルコードを見ると、pixWriteMem()の出力が解放されているように見えます。したがって、NSDataのfreeWhenDone:引数にYESを渡します。このような

何か(警告:未テストコード):

UIImage *GetImageFromPix(Pix *thePix) 
{ 
    UIImage *result = nil; 

    l_uint8 *bytes = NULL; 
    size_t size = 0; 

    if (0 == pixWriteMem(&bytes, &size, thePix, IFF_TIFF)) { 
     NSData *data = [[NSData alloc] initWithBytesNoCopy:bytes length:(NSUInteger)size freeWhenDone:YES]; 
     result = [UIImage imageWithData:data]; 
     [data release]; 
    } 

    return result; 
} 
+0

G8Tesseract.mで、以下の方法を参照してください。しかし、Leptonicaの私のバージョンは 'pixWrite ...'関数のサポートなしでコンパイルされているようです。私は正しく、これらの機能をサポートするようにコンパイルするには './configure --with-libtiff = ../libtiff/out'のようにしてから再コンパイルする必要がありますか? – mym

+0

ええと、libtiffで再設定する必要があるようです。しかし、LeptonicaのREADMEを読んでいると、 "Leptonicaは、bmpとpnmフォーマットの画像I/Oも可能にしています。シリアライザを提供しています..."、UIImage initWithData:BMPをサポートする必要があるので、働くIFF_TIFFをIFF_BMPに変更して何が起こるかを確認してください – iccir

+0

i386とarmv7プラットフォームの両方でこの機能が実装されていないようですが、この機能は実装されていないようです - pixWriteMemBmp:bmpのメモリへの書き込みがこのプラットフォームに実装されていません。 – mym

0

は、仲介ファイル形式に書き出します。および読み込みは、Pixメモリ内データ構造からUIImageデータ構造(またはメモリ内の画像のための多くのコンテナ)に変換するための単純ではあるが非効率的な方法です。

画像データはそれをリードバックした後、圧縮されていないラスタにそれを書き込む前に圧縮を受け、減圧する必要があるため、中間ファイルの表現は、(例えば、PNG)圧縮されている場合は、計算上、特に非効率的である。

構造体Pix構造体Xに変換する効率的な方法は、Xのメタデータフィールド(画像サイズ、深度、解像度、テキストなど)を入力し、画像がカラーマップされている場合は構造体Xのカラーマップを生成します画像ラスタデータをPixコンベンションからXコンベンションに変換します。あなたは2のメモリ内のラスタ表現のそれぞれについて、以下検討する必要があるので、この最後のは、唯一のトリッキーな部分です:

ラスタラインについて

(1)パディング(PIXが4バイトに水増しされます)
(2) (Pixは4バイト:rgbaのような)3成分ピクセルのサイズ
(3)マルチコンポーネントピクセルの格納(Pixは、rgbaバイトオーダーを決定するマクロを使用します)
(5)ピクセルの順序:画像の左から右へ、それぞれ32ビットワードのMSBからLSBの順に格納されます。

struct Pixの仕様はleptonica srcファイルpix.hで与えられています。ここで

0

実装(32 BPP - > UIImage)あなたは1枚のBPPの画像を変換したい場合は(exapmle用閾値)

- (UIImage *)imageFromPix:(Pix *)pix 
{ 
    l_uint32 width = pixGetWidth(pix); 
    l_uint32 height = pixGetHeight(pix); 
    l_uint32 bitsPerPixel = pixGetDepth(pix); 
    l_uint32 bytesPerRow = pixGetWpl(pix) * 4; 
    l_uint32 bitsPerComponent = 8; 
    if (pixSetSpp(pix, 4) == 0) { 
     bitsPerComponent = bitsPerPixel/pixGetSpp(pix); 
    } 

    l_uint32 *pixData = pixGetData(pix); 

    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, pixData, bytesPerRow * height, NULL); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    CGImage *cgImage = CGImageCreate(width, height, 
            bitsPerComponent, bitsPerPixel, bytesPerRow, 
            colorSpace, kCGBitmapByteOrderDefault, 
            provider, NULL, NO, kCGRenderingIntentDefault); 

    CGDataProviderRelease(provider); 
    CGColorSpaceRelease(colorSpace); 

    UIImage *image = [UIImage imageWithCGImage:cgImage]; 
    return image; 
} 

- (UIImage *)imageFrom1bppPix:(Pix *)pix 
{ 
    Pix *pix32 = pixUnpackBinary(pix, 32, 0); 

    UIImage *image = [self imageFromPix:pix32]; 

    pixDestroy(&pix32); 

    return image; 
} 
関連する問題