1

画像のトリミングを含む winforms プロジェクトに取り組んでいます。私の目標は、固定サイズのドラッグ可能なピクチャ ボックス コントロールを使用してこれを行い、ユーザーが保存したい領域を選択できるようにすることです。

私の問題は、画像をトリミングするときです。「動作」しますが、トリミング領域が少しずれます。これが私が得る結果です:

元の画像 トリミングされた画像

明確にするために、ズームについて話しているのではなく、それは設計ごとです。オレンジ色のボックスはほとんどが嵐の目に焦点を合わせていますが、トリミングされた画像はそうではありません。

これはトリミング操作の私のコードです:

private void tsbRecortar_Click(object sender, EventArgs e)
{
    Rectangle recorte = new Rectangle(pbxSeleccion.Location.X, pbxSeleccion.Location.Y, pbxSeleccion.Width, pbxSeleccion.Height);

    foto = recortarImagen(foto, recorte);
    pbxImagen.Image = foto;
}

private Image recortarImagen(Image imagen, Rectangle recuadro)
{
    try
    {
        Bitmap bitmap = new Bitmap(imagen);
        Bitmap cropedBitmap = bitmap.Clone(recuadro, bitmap.PixelFormat);

        return (Image)(cropedBitmap);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error");

        return null;
    }
}

pbxSeleccionは、ドラッグ可能なオレンジ色の四角形です。その親はpbxImage です(フォームの読み込み時に再親化します)。

ご覧のとおり、トリミング領域の開始点を定義するためにpbxSeleccionの座標を使用していますが、期待どおりに機能していません... 時々、「メモリ不足」の例外が発生することさえあります。

これは、親のピクチャボックスに画像がどのように読み込まれるか、「ボンネットの下で」マージンがどのように処理されるか、何かに関係していると思いますが、修正しようとしたことはありません...オフセットの大きさを変更するだけです。

Web と SO を検索することは私を大いに助けてくれましたが、この特定の問題については、答えが見つからないようです...コードの改善点を自由に指摘してください。私は長い間コーディングしていません。 C# と .NET は初めてです

どんな助けでも大歓迎です。乾杯!

4

2 に答える 2

1

元の画像が に表示されているとしますPictureBoxオレンジ色のトリミング ウィンドウの間違った場所を渡しました。修正されたコードは次のとおりです。

private void tsbRecortar_Click(object sender, EventArgs e){
  Point p = yourPictureBox.PointToClient(pbxSelection.PointToScreen(Point.Empty));
  Rectangle recorte = new Rectangle(p.X, p.Y, pbxSeleccion.Width, pbxSeleccion.Height);

  foto = recortarImagen(foto, recorte);
  pbxImagen.Image = foto;
}

PointToClientここでandを使用するPointToScreenのは、それが最善の方法だと思うからです。pictureBoxその後、コードを変更せずに安全なコンテナーを変更できます。pictureBox次のようなコードを使用すると、別のコンテナーに配置するときに動的に十分ではありません。

Rectangle recorte = new Rectangle(pbxSeleccion.X + yourPictureBox.Left,
                                  pbxSeleccion.Y + yourPictureBox.Top, 
                                  pbxSeleccion.Width, pbxSeleccion.Height);

RectangleToClient:次のように使用することもできますRectangleToScreen

private void tsbRecortar_Click(object sender, EventArgs e){
   Rectangle recorte = yourPictureBox.RectangleToClient(pbxSeleccion.RectangleToScreen(pbxSeleccion.ClientRectangle));
   foto = recortarImagen(foto, recorte);
   pbxImagen.Image = foto;
}
于 2013-09-21T16:11:02.457 に答える