16

Ghostscript を使用して、背景が透明な PDF ファイルを背景が透明な PNG ファイルにラスタライズしようとしましたが、うまくいきませんでした。同じことを試みている他の人からの質問を高低で検索しましたが、投稿された解決策はどれも -sDEVICE=pngalpha を指定することに帰着し、私のテスト ファイルで動作しませんでした。この時点で、経験豊富な方からのアドバイスやヒントをいただければ幸いです。

私のテスト PDF はここにあります: http://www.kolossus.com/files/test.pdf

問題はこのファイルにある可能性がありますが、私はそれを疑っています。私が知る限り、指定された背景はありません。Photoshop や Illustrator などの透明度を認識するアプリでファイルを開くと、確かに透明な背景で表示されます。ただし、Adobe Reader などのアプリケーションで開くと、ファイルは白い背景でレンダリングされます。これは、PDF 自体よりも PDF をレンダリングするアプリケーションに関係していると私は信じています。よくわかりません。

私が使用している gs コマンドは次のとおりです。

gs -dNOPAUSE -dBATCH -sDEVICE=pngalpha -r72 -sOutputFile=test.png test.pdf

これにより、ファイル内のアートワークのバウンディング ボックスの外側に透明なピクセルを持つ PNG が生成されますが、アートワークのバウンディング ボックスの内側にあるすべてのピクセルは白い背景に対してラスタライズされます。私のアートワークには、最終出力で保持する必要があるドロップ シャドウとアンチエイリアス処理されたエッジがあり、ImageMagick で後処理することはできないため、これは私にとって問題です。私の PNG 出力のサンプルは、上記の pdf と同じ場所にあり、末尾に .png があります (stackoverflow では、投稿に複数の URL を含めることはできません)。

興味深いことに、-dBackgroundColor=16#ff0000 のように白以外に設定しても、-dBackgroundColor フラグを使用しても効果は見られません。おそらく、このフラグの構文に関する私の理解は間違っています。

また興味深いことに、-dTextAlphaBits=4 -dGraphicsAlphaBits=4 フラグを使用してサブピクセル アンチエイリアシングを有効にしようとしても効果が見られません。また、特にテキストでサブピクセル アンチエイリアシングを有効にする方法についてアドバイスをいただければ幸いです。

最後に、私は Mac OS 10.5.7 で GPL Ghostscript 8.64 を使用しています。設定しようとしているレンダリング ワークフローは、PrinceXML によって出力された PDF から透明な PNG 画像を生成することです。ImageMagick は PDF のラスタライズを Ghostscript に委任し、GS を直接呼び出すことでラスタライズをより適切に制御できるはずなので、ImageMagick を使用する代わりにラスタライズのために直接 Ghostscript を呼び出しています。

ご協力いただきありがとうございます。

-ジョン・ウルフ

4

3 に答える 3

20

-dTextAlphaBits=4-dGraphicsAlphaBits=4フラグに関するあなたの経験を共有します。それらはすべてのテキストで機能するわけではないようです。私が思いついた「修正」は、画像を目的のサイズの 4 倍でレンダリングしてから、画像を縮小することでした。幸いなことに、ghostscript はギガピクセル PNG ファイルのレンダリングに問題はありません。

アップデート

Ghostscript (バージョン 9 まで) も、ピクセル数が 2.500.000 (つまり、10 mb のピクセル バッファ) を超える透過 PNG をレンダリングするときに大きな問題を抱えているようです。透明な背景が突然白くなります。

Ghostscript のソースを掘り下げると、ピクセル バッファー サイズが 10 MB を超えると、別のメモリ割り当てスキームに切り替わることがわかりました。より具体的には、画像は のimage32代わりにdevice を使用してレンダリングされますpngalpha。ドライバーの実装方法を考えると、pngalphags が使用しないことを決定すると、その目的全体が失われますpngalpha_fill_rectangle()

幸いなことに、-dMaxBitmap=N実行時にこのパラメーターを構成するために呼び出されるスイッチがあります。これは、1999 年 1 月 15 日にさかのぼるまったく別のバグの回避策で言及されています

追加すること-dMaxBitmap=2147483647で、多くの問題が解決しました。64 ビット システムでは、この数値が高くなる可能性があります。

もちろん、実際のコード パスに関係なくpngalpha背景色を設定するようにドライバーを修正することが真の解決策ですが、ほとんどのシステムには、上記のトリックが機能するのに十分な RAM が搭載されています。0x7f000000

于 2011-02-05T14:21:32.797 に答える
2

Ghostscript で何ができるかはわかりませんが、提案があります。黒と白の両方の背景で PDF をレンダリングしてみてください。2 つの画像で同じ結果になるピクセルは、明らかに不透明 (すなわち、アルファ == 1.0) であることが意図されていました。異なるピクセルは、白い背景のピクセルから黒い背景のピクセルを減算することによって計算できるゼロ以外のアルファを持ちます。赤、緑、または青のコンポーネントの値がアルファ値になります。

于 2009-06-29T02:41:28.137 に答える
2

Ghostscript は、ビルド時に「transpar」オプションが選択された場合にのみ透過性を処理できます。Ghostscript が適切なバージョンであると仮定すると、コマンドラインにパラメーターを追加できます。

... -c "0 .setopacityalpha" -f c:/path/to/file/to/be/converted.pdf

([0..1] の範囲で不透明度のバリアントを使用できます)。

また、ImageMagickまたは GraphicMagick のコマンドを使用して、Ghostscript で作成された .png (実際に背景が透明ではなく白の場合) を透明な背景に変換しようとしましたか? 次に例を示します。convertgm convert

convert -background transparent test.png test_transp.png

ところで、Acrobat または AcroReader がすべてのページの背景を白として表示する場合: これは、実際に透明な背景であってもデフォルト設定です。アプリケーションのセットアップ オプションで変更できます。IIRC では、設定は [ページ表示] オプション内にあり、s.th という名前が付けられています。「透明度ラスターを表示」のように。(詳細に調べたとしても、あまり役に立たないかもしれません。Adobe は新しいリリースごとにすべてのオプションを変更し続けています。自分で調べてみると、そこにあることがわかります。)

于 2010-06-05T17:12:22.737 に答える