問題タブ [metafile]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - EMFファイルのDPI
EMFファイルには設定可能なDPIがありますか?画像を複数の形式(EMFを含む)で保存できるアプリケーションがあります。ユーザーが画像の解像度/DPIを指定できるようにします。ただし、C#のメタファイルに対してこれを行う方法が見つかりません。これは可能ですか、それともベクターグラフィックス形式であるためEMFにDPIがありませんか?
c# - メタファイルの逆シリアル化
Enhanced Metafilesで動作するアプリケーションがあります。
それらを作成し、.emf としてディスクに保存し、再度問題なくロードできます。
これは、gdi32.dll メソッドとDLLImport 属性を使用して行います。
ただし、バージョン トレラント シリアル化を有効にするために、メタファイルを他のデータと共にオブジェクトに保存したいと考えています。
これは基本的に、メタファイル データをバイト配列としてシリアライズし、メタファイルを再構築するために再度デシリアライズする必要があることを意味します。
私が抱えている問題は、メタファイルを再構築するために使用する方法で「パラメーターが無効な例外」が発生するため、逆シリアル化されたデータが何らかの形で破損しているように見えることです。
少なくとも、ピクセル形式と解像度が変更されました。
コードの使用は以下です。
アプリケーションはメタファイル イメージを作成し、それを以下のメソッドに渡します。
この時点で、dataArray がオブジェクトに挿入され、BinaryFormatter を使用してシリアル化されます。
保存されたファイルは、オブジェクトから取得した BinaryFormatter と dataArray を使用して再度シリアル化解除されます。
次に、dataArray を使用して、次の方法で元のメタファイルを再構築します。
再構築されたメタファイルは、.emf (モデル) としてディスクに保存されます。この時点で、Presenter がアクセスして表示できます。
問題は、ディスクへの保存が失敗することです。これと同じ方法を使用して元のメタファイルをシリアル化する前に保存すると、すべて問題ありません。そのため、シリアライゼーション/デシリアライゼーション中にデータに何かが起こっています。
実際、デバッガーでメタファイルのプロパティを確認すると、ImageFlags、PropertyID、解像度、およびピクセル形式が変更されていることがわかります。
元の Format32bppRgb から Format32bppArgb への変更
元の解像度 81 が 96 に変更されました
私はグーグルとSOをトロールしましたが、これは私がここまで到達するのに役立ちましたが、今は立ち往生しています。
メタファイル/シリアライゼーションで十分な経験を持っている人はいますか..?
編集:バイト配列を(別のオブジェクトに埋め込まずに)直接シリアライズ/デシリアライズすると、同じ問題が発生します。
vb.net - VB コードから Delphi への変換 (EMF ファイルから画像を抽出します)
ネットで検索しているときに、EMF ファイルから画像を抽出するための VB のコードを数行取得しました。
それをDelphiに変換しようとしましたが、うまくいきません。
このコードをデルファイに変換するのを手伝ってください。
delphi - Delphi の TCanvas で透明な TMetaFile を描画する
透かしの印刷に使用される透明な TMetaFile を Canvas に描画したいと思います。
問題は、AlphaBlend 関数が TMetaFile.Handle をソースとして認識しないことです。キャンバス ハンドルが必要です。
透明度のある 32 ビット ビットマップを作成しましたが、その上に描画すると背景が白くなるため、Canvas ではアルファ ブレンドされた四角形が表示されます。透明な TMetaFile をスクリーン/プリンター Canvas にペイントするにはどうすればよいですか?
TMetaFile は確かに透過的です。IE を使用して非標準の背景色で単純な Web ページでテストしました。ソースコード:
image - 元の .BMP/.EMF 画像ファイルと処理済みの .BMP/.EMF ファイルの違いを見分ける方法は?
要約:
3289 X 4570 X 32bpp の .BMP 画像は約 53MB 必要です。同じサイズで24bppの写真は約43MB、16bppの写真は約28MBかかります。私の状況では、ChemDraw で処理された画像ファイルを 24bpp から 16bpp に変換する必要があります。
両方のファイルの 16 進データをさらに比較すると、ChemDraw で処理された画像と元の画像の違いをより詳細に理解できます。具体的には、ChemDraw は「EMF_STRETCHBLT」ではなく「EMF_STRETCHDIBITS」を保存します。「EMF_STRETCHDIBITS」は、ピクセルを TMetaFile/TMetaFileCanvas にコピーするときに StretchDIBits を呼び出すことによって実行できることを追加する必要があります。また、「EMF_STRETCHDIBITS」のピクセルは「EMF_STRETCHBLT」のピクセルと同じでなければならないことに注意してください。
残念ながら、ChemDraw が貼り付けた画像を正確に処理して保存する方法については、これまでわかりませんでした。つまり、ChemDraw に格納されたピクセルが、プログラムで取得できるピクセルと異なる理由がわかりませんでした。
PS: 現時点では十分な評判が得られないため、後でこの質問に関する親切な回答を投票します。親切にコメントしてくれたみんなありがとう!
===</p>
やあ、
ありがとうございました!
「sample_original.bmp」という名前の写真があるとします。ファイルサイズは3289×4570、43MB。次に、次のようにして .EMF ファイル (Enhanced Windows MetaFile) に変換します。
方法 1、社内で小さな Delphi プログラムを作成する方法: (1) .BMP イメージ ファイルをロードします。(2) TMetaFile(TMetaFileCanvas) の Canvas を取得します。 (3) Canvas.Draw を呼び出して画像をコピーします。(4) 「sample_original_bmp2emf_method1.emf」という名前の .EMF ファイルに保存します。
方法 2: (1) mspaint プログラムで .BMP イメージ ファイルを開き、[すべて選択] を選択して、[コピー] を選択します。(2) ChemDraw という外部プログラムを開き、新しいドキュメントを作成し、「貼り付け」を選択します。(3) 次に、「sample_original_bmp2emf_method2.cdxml」という名前の XML 互換の .cdxml 形式で保存することを選択します。(4) 画像の内容 (おそらく変更または劣化?) が sample_original_bmp2emf_method2.cdxml ファイルに保存されるようになりました。形式は Base64 でエンコードされた zlib 圧縮形式です。(5) XML 文字列を Base64 でデコードし、zlib で解凍して、画像ファイル "sample_original_bmp2emf_method2.emf" に保存できます。
sample_original_bmp2emf_method2.emf のファイル サイズは、sample_original_bmp2emf_method1.emf よりも 15 MB 小さくなりますが、幅と高さは維持されています。さらに、mspaint プログラムで「sample_original_bmp2emf_method2.emf」を開き、.bmp ファイル形式で保存し直すと、透明な情報が失われているという警告が表示されます。
「sample_original_bmp2emf_method1.emf」と「sample_original_bmp2emf_method2.emf」の違いを見分ける方法についてコメントしていただけませんか? 画質が落ちたので画像が小さくなりましたか?言い換えれば、この外部プログラムによって元の画像にどのような変更を加えることができるでしょうか?
幸運をお祈りしています、
上記のファイルは、次の URL でダウンロードできます。
http://www.rapidspread.com/file.jsp?id=2ighvzoci8
PS: Andreas Rejbrand が親切にも答えてくれたと思います。それからコメントをしました。しかし、私は今それらを見ることができません。それはシステムの正常な動作であるはずですか?o_o
c# - Winform でドラッグ アンド ドロップしてメタファイルを画像に変換する方法
C# でフレームワーク .NET 3.5 を使用して Winform アプリケーションを開発しています。ユーザーが Word 2007 から画像をドラッグ アンド ドロップできるようにしたいと考えています。基本的に、ユーザーは docx を開き、画像を選択して、PictureBox にドラッグ アンド ドロップします。
デスクトップおよびインターネット ページからの画像ファイルで同じプロセスを既に実行しましたが、メタファイルの問題を解決できません。私はほとんど調査を行いませんでしたが、私の問題を解決する解決策は見つかりませんでした。
Drag&Drop イベントで行ったことは次のとおりです。
このコードでストリームを取得できます: (Stream)e.Data.GetData(DataFormats.MetafilePict) しかし、それを Metafile またはより良い Image オブジェクトに変換する方法がわかりません。
何かアイデアや解決策があれば、喜んでお読みください。
ありがとう、
c# - メタファイルがビットマップを「失う」のはなぜですか?
最近、メタファイルを使った描画中にバグを見つけました。今のところ、何か間違ったことをしているのか、それともメタファイル自体の描画にバグがあるのか わかりません。
PlayEnhMetafile によって別のメタファイル自体に描画されているメタファイルに画像を描画しているときに、画像がはるか下または右に失われます。画面座標と関係があると思います (デュアル スクリーン 1280*1024 を実行しているので、2560*1024 です)。画像が消え始める一番下のレーンは約 500 です。
問題をより具体的に示すために作成したサンプルコードを次に示します。(新しく作成した Windows C# プロジェクトの Form1.cs をこのコードに置き換えて、ボタンを配置するだけです)。
ご覧のとおり、PlayEnhMetaFile 関数を使用すると、3 つの画像のうちの 1 つが失われます。何か案は?
winapi - ピクセルの丸めなしで拡張メタファイルを Windows メタファイルに変換する適切な方法
拡張メタファイル (C# で GDI+ を介して構築) を古いスタイルの Windows メタファイルに変換すると、座標が最も近い画面ピクセルに丸められるため、結果は非常に粗くなります。どちらかを介して変換すると、これが表示されます
GetWinMetaFileBits(emfh, bits_l, bits, MM_ANISOTROPIC, GetDC(0));
または GDI+ の Metafile::EmfToWmfBits を使用します。犯人はおそらく使用されているスクリーンDCです。 この投稿は、私にとっては機能するプリンター DC の使用を示唆していますが、ユーザーがプリンターをインストールしていない場合は明らかに機能しません。より良い方法はありますか?この目的のために高解像度のメモリ内 DC を作成することを検討しましたが、そのための適切なドキュメントが見つからず、使用される RAM についても心配しています。
winapi - GetWinMetaFileBits() の参照 DC パラメータは正確には何に使用されますか?
従来の Win16 メタファイルにはサイズや解像度の情報が埋め込まれていないという印象を受けました (METAFILEPICT
ヘッダーなどがない限り) -GetWinMetaFileBits()
参照 DC は何に使用されますか?
windows - 3D シーンを 2D 拡張メタファイルに効率的に変換する方法はありますか
Delphi2010 と OpenGL を使用して CAD アプリケーションを開発しています。現在、現在のビューを画像ファイルにエクスポートするモジュールに取り組んでいます。
これは、ラスター形式 (目的のディメンションのオフスクリーン バッファーにシーンをレンダリングし、バッファーをディスクに書き込む) の場合は非常に簡単ですが、シーンの軸に沿った 2D ビューをベクトル形式、できれば Winows EMF にエクスポートできるようにしたいと考えています。 .
ソフトウェアで変換と投影を計算するか、glFeedback 機能を誤用することを考えていました。独自の Z バッファリングを実装する必要があるため、ハードウェア アクセラレーションを使用せずに複雑なシーンをレンダリングする際に直面する可能性があるパフォーマンスの問題は言うまでもなく、このアプローチはかなり面倒に思えます。
私の Google-fu は結果につながらなかったので、この問題 (Opengl-3d-scene を 2d-Vectorimage に変換する) の経験があるかどうか、または実装することが知られているサードパーティのライブラリがあるかどうかを尋ねたいと思います。これ。