今、9スライスのコードが期待どおりに機能しない理由を理解しようとしました。私が見る限り、9つのスライス画像を正しく処理しないGraphics.DrawImageメソッドの問題があるようです。だから私の問題は、コンパクトなフレームワークで自分のコードを実行するときに実行される不正なスケーリングをどのように補正するかです。私は、このコードは完全なフレームワーク環境で動作しているときに完全に動作することを追加するかもしれません。この問題は、画像を大きな画像に拡大縮小するときにのみ発生します。ここにスニペットがあります:DrawImageでスライスされた画像の位置を正しく設定できない
public class NineSliceBitmapSnippet
{
private Bitmap m_OriginalBitmap;
public int CornerLength { get; set; }
/// <summary>
/// Initializes a new instance of the NineSliceBitmapSnippet class.
/// </summary>
public NineSliceBitmapSnippet(Bitmap bitmap)
{
CornerLength = 5;
m_OriginalBitmap = bitmap;
}
public Bitmap ScaleSingleBitmap(Size size)
{
Bitmap scaledBitmap = new Bitmap(size.Width, size.Height);
int[] horizontalTargetSlices = Slice(size.Width);
int[] verticalTargetSlices = Slice(size.Height);
int[] horizontalSourceSlices = Slice(m_OriginalBitmap.Width);
int[] verticalSourceSlices = Slice(m_OriginalBitmap.Height);
using (Graphics graphics = Graphics.FromImage(scaledBitmap))
{
using (Brush brush = new SolidBrush(Color.Fuchsia))
{
graphics.FillRectangle(brush, new Rectangle(0, 0, size.Width, size.Height));
}
int horizontalTargetOffset = 0;
int verticalTargetOffset = 0;
int horizontalSourceOffset = 0;
int verticalSourceOffset = 0;
for (int x = 0; x < horizontalTargetSlices.Length; x++)
{
verticalTargetOffset = 0;
verticalSourceOffset = 0;
for (int y = 0; y < verticalTargetSlices.Length; y++)
{
Rectangle destination = new Rectangle(horizontalTargetOffset, verticalTargetOffset, horizontalTargetSlices[x], verticalTargetSlices[y]);
Rectangle source = new Rectangle(horizontalSourceOffset, verticalSourceOffset, horizontalSourceSlices[x], verticalSourceSlices[y]);
graphics.DrawImage(m_OriginalBitmap, destination, source, GraphicsUnit.Pixel);
verticalTargetOffset += verticalTargetSlices[y];
verticalSourceOffset += verticalSourceSlices[y];
}
horizontalTargetOffset += horizontalTargetSlices[x];
horizontalSourceOffset += horizontalSourceSlices[x];
}
}
return scaledBitmap;
}
public int[] Slice(int length)
{
int cornerLength = CornerLength;
if (length <= (cornerLength * 2))
throw new Exception("Image to small for sliceing up");
int[] slices = new int[3];
slices[0] = cornerLength;
slices[1] = length - (2 * cornerLength);
slices[2] = cornerLength;
return slices;
}
}
私の質問は、間違ったスケーリングをどのように補償できるかです。 /ダン
エラーは何ですか?または、動作していないイメージをリンクすることはできますか? – LarsTech
問題は、画像をもう一度つなぎ合わせて、大きな画像にスケーリングした場合、一方向にのみ伸びる部分は、1ピクセル伸びで、もう一方の方向に引き伸ばされるということです。私は私の評判のより高い評価を得るとき、間違ったDrawImage動作のイメージを投稿しようとします。 –
スマートデバイス(WCE)上で実行されているDrawImageのコンパクトなフレームワーク版は、一方向に伸びた画像に問題があり、このような誤った動作をしているようです。画像を両方向に伸ばすと正しい画像になります。問題を集約する:DrawImageを使用してイメージを水平方向にストレッチすると、予期しないことにイメージが縦方向にもわずかに伸びます。 –