0

寸法が 25.5"x11" (レター ページの 3 倍) の 600 DPI の「三つ折り」画像を作成する必要があります。そのために、DrawingVisual、DrawingContext、および RenderTargetBitmap クラスを通じて WPF Imaging を使用しています。

たとえば、400 DPI 以下の低解像度で画像を生成すると、すべてのテキストが期待どおりに正しい位置に表示されます。ただし、画像の解像度を 500 DPI レベル以上に上げると、画像の右端に配置された特定のテキストが単純に消え、他の相対的に配置されたテキスト/図形は完全に印刷されます。それについての最もクレイジーな部分は、DPI を変更しようとすると、異なるテキストが表示/非表示になることです。あるテスト ケースでは、600 DPI では描画された FormattedTexts の 1 つのセットが欠落し、650 DPI では描画された FormattedTexts ののセットが欠落し、700 DPI ではすべて正常に印刷されます。

以下のコード スニペットで問題を再現しました。そのまま (600 DPI) 実行すると、非常に大きな白い画像が表示されます。Dpi 定数を 400 以下に変更すると、テキストが問題なく印刷されます。

DrawingVisual クラス (VisualBitmapScalingMode、VisualTextRenderingMode、VisualEdgeMode など) 内の多くのノブを回してみましたが、役に立たなかったことに注意してください。これらの設定に関する私の調査のほとんどは、テキストが消えるのではなく、「あいまいな」テキストを修正するのに役立つ設定であることがわかりました。また、DrawingVisual または DrawingContext のガイドライン/スナップ設定のいずれについてもうまくいきませんでした。

この問題は Win7 と Win2008R2 の両方で再現されており、アプリケーションは .NET 4.5 を実行していることに注意してください。

何か案は?

        const double ImageWidthInches = 25.5;
        const double ImageHeightInches = 11.0;
        const double Dpi = 600.0;
        const double DeviceIndependentUnits = 96.0;
        const double TypographicUnits = 72.0;

        var visual = new DrawingVisual();
        var drawing = visual.RenderOpen();

        drawing.DrawRectangle(
            Brushes.White,
            null,
            new Rect(0,
                     0,
                     ImageWidthInches*DeviceIndependentUnits,
                     ImageHeightInches*DeviceIndependentUnits));

        var formattedText = new FormattedText(
            "Why doesn't this display?",
            CultureInfo.CurrentUICulture,
            FlowDirection.LeftToRight,
            new Typeface(new FontFamily("Arial Narrow"),
                         FontStyles.Normal,
                         FontWeights.Normal,
                         FontStretches.Normal),
            8.0*DeviceIndependentUnits/TypographicUnits,
            Brushes.Black);
        drawing.DrawText(formattedText,
                         new Point(23.39*DeviceIndependentUnits,
                                   2.6635416666666671*DeviceIndependentUnits));

        drawing.Close();

        var renderTarget = new RenderTargetBitmap(
            (int) (ImageWidthInches*Dpi),
            (int) (ImageHeightInches*Dpi),
            Dpi,
            Dpi,
            PixelFormats.Default);
        renderTarget.Render(visual);

        var tiffEncoder = new TiffBitmapEncoder {Compression = TiffCompressOption.Ccitt4};
        tiffEncoder.Frames.Add(BitmapFrame.Create(renderTarget));

        using (var fileStream = new FileStream(@"c:\recreateWpfTextIssue.tif", FileMode.Create, FileAccess.Write))
            tiffEncoder.Save(fileStream);
4

1 に答える 1