0

私は、ユーザーがビューポートに画像を追加し、サイズを変更し、トリミングし、回転できるようにするアプリケーションに取り組んできました。回転が機能するように、Raphael.jsライブラリを使用して画像がSVGとして追加されます。

すべての画像にはアウトラインがあります(ラッパーと呼ばれます)。画像のサイズが変更されると、そのラッパーもサイズ変更されます。画像を回転させると、ラッパーも拡張され、回転した画像が含まれるようになります(以下の画像を参照)。

ラッパー内に含まれる画像

ここまでは順調ですね。回転した後に画像オブジェクトのサイズを変更しようとすると、そのアウトラインに含まれなくなります(以下の画像を参照)。

回転後の画像のサイズ変更

画像のサイズを変更するときは、svgオブジェクトの「x」および「y」属性も調整する必要があります。画像の新しいサイズ(幅+高さ)と「x」および「y」属性の両方が、次のように計算されます。

var ratio_width = w / init.wrapper.width,         // w = the new width of the wrapper (computed at each resize step)
    ratio_height = h / init.wrapper.height,       // h = the new height of the wrapper

    svg_width = init.svg.width * ratio_width,     // svg_width = the new width of the image
    svg_height = init.svg.height * ratio_height,  // svg_height = the new height of the image

    x = init.svg.x*ratio_width,
    y = init.svg.y*ratio_height;

this.svg.attr({
    "x": x,
    "y": y,
    "width": svg_width,
    "height": svg_height
});

「init」JavaScriptオブジェクトには、ラッパーのサイズ(幅と高さ)と画像のサイズ(画像が回転した後、サイズが異なります)だけでなく、サイズ変更操作前のx属性とy属性の値も含まれます。 。

重要なのは、上記で計算されたすべての値が正しいということです。サイズ変更の各ステップでsvgを破棄して再追加しようとしたので(ただし、オプションではなく、ちらつきが多すぎます)、サイズ、xyの値は同じで、次のようになります。

// "this.angle" on the second line is the current rotation angle
this.svg.remove();
this.svg = this.canvas.image(this.src,x,y,svg_width,svg_height).transform("r"+this.angle);

したがって、単にオブジェクトを削除してから、上記の値を使用してオブジェクトを再作成した場合、属性を変更するだけで適切に機能しないのはなぜですか?3日間髪を抜いてますので、よろしくお願いします!

4

0 に答える 0