0

私は長方形を持っていて、それを画像で埋めます

 <Rectangle Height="95" Fill="{Binding Path=Image,RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay,Converter={StaticResource ConvertBase64toImage}}" Stroke="{x:Null}" x:Name="EditPhotoRectangel">
       <Rectangle.BitmapEffect>
           <DropShadowBitmapEffect ShadowDepth="7" Softness="0.75"/>
       </Rectangle.BitmapEffect>
 </Rectangle>

画像は、画像を設定したbase64文字列です。

 private string ImageToBase64(System.Drawing.Image image, ImageFormat format)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            // Convert Image to byte[]
            image.Save(ms, format);
            byte[] imageBytes = ms.ToArray();

            // Convert byte[] to Base64 String
            string base64String = Convert.ToBase64String(imageBytes);
            return base64String;
        }
    }

コンバーターを使用して、Base64を長方形を塗りつぶすためのimagebrushに変換します。

 ImageBrush brush = new ImageBrush();
 BitmapImage bitmap = new BitmapImage();
 // convert base64string to byte[].
 byte[] binaryData = System.Convert.FromBase64String((string)value);
 bitmap.BeginInit();
 // Initializes a new non-resizable instance of the MemoryStream class based on the binaryData array.
 bitmap.StreamSource = new MemoryStream(binaryData);
 bitmap.EndInit();
 //set bitmapimage for brush imagesource 
 brush.ImageSource = bitmap;
 return brush;

私の問題はRectangle、myimageを反転させてこの塗りつぶしの画像を選択したときです。

4

2 に答える 2

2

これは単なる推測です...確認のためにサンプルを作成する必要があります...

System.Drawing.ImageソースビットマップのバイナリデータのエンコードとバイナリデータSystem.Windows.Media.BitmapImageの逆シリアル化に使用していることに気付きました。

GDI +(WinForms)の世界とWPF(DirectX)のエンコーダー/デコーダーの間には、サポートに多少の違いがあるはずです。特に、、ImageFormat.MemoryBmpまたはmyimage.RawFormat(つまり、で公開されているプロパティImage)を使用している場合は、問題が発生する可能性があります。

DIB(デバイスに依存しないビットマップ)では通常、スキャンラインが下から上に、つまり逆さま(負のストライド)で保存されます。

したがってSystem.Drawing.Bitmap、このプロセス全体のソースである作成/初期化の方法に関係している可能性があります...多分あなたが使用CopyPixelsした...ピクセルが下から上に配置されているデータ、またはその逆のデータを指していました。

.Saveその着信で物理BMPまたはJPEGファイルに対してを実行してBitmap、それが正しい方法であるかどうかを確認しましたか(デバッガーで実行することもできます)。

この変換の大失敗の原因を突き止めることができない場合、考えられる解決策は次のとおりです。

  • 画像を適切な方法に戻すために必要な変換を行うか、
  • 別の方法を使用するImageFormat/別の方法で着信Bitmapを作成するまたは
  • base64データを逆シリアル化してビットマップに戻すときは、System.Drawing.Imageクラスを再度使用します(したがって、シリアル化プロセスの両端で同じタイプのクラスを使用しました)が、そのオブジェクトをオブジェクトに変換しBitmapImageます。

着信を作成する方法の詳細を提供できる場合、System.Drawing.Bitmapつまりファイルからロードする場合(どの形式ですか?)、ファイルを作成してからコンテキストを介して描画するGraphics場合、またはCopyPixelsを使用してコピーする場合どこかからの生のピクセルデータ(たとえば、通常スキャンラインを下から上に格納するDIBから)。

いくつかの情報リンク:

于 2012-12-11T19:48:44.157 に答える
1

私が使う

 FlowDirection="LeftToRight"

それは私のための仕事です:)

于 2012-12-19T06:38:47.853 に答える