ภาพแรสเตอร์ไม่อยู่ตรงกลางหลังจากการซูมให้พอดีกับหน้าใน Paper.js

ฉันกำลังทำงานกับแอปพลิเคชัน Paper.js ที่ใส่ raster (รูปภาพ) ไว้ใน view จากนั้นจะซูมให้พอดีกับภาพเพื่อให้มองเห็นทั้งหมดได้ในคราวเดียว ส่วนใหญ่จะใช้งานได้ แต่รูปภาพกลับกลายเป็นการชดเชย เช่นนี้

ชดเชย

เมื่อใดควรมีลักษณะเช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือโค้ดที่สร้าง view เพิ่มรูปภาพ และทำการเรียกให้ซูมให้พอดี:

// Set up HTMLImage
var image = new Image(this.props.image.width, this.props.image.height);
image.src = 'data:image/png;base64,' + this.props.image.imageData;

//var canvas = React.findDOMNode(this.refs.canvas); // React 0.13 +
var canvas = this.refs.canvas.getDOMNode();

// Scale width based on scaled height; canvas height has been set to the height of the document (this.props.height)
var scalingFactor = canvas.height/image.height;
canvas.width = image.width * scalingFactor;

// Initialize Paper.js on the canvas
paper.setup(canvas);

// Add image to Paper.js canvas
var raster = new paper.Raster(image, new paper.Point(0,0));

// Fit image to page so whole thing is displayed
var delta = scalingFactor < 1 ? -1 : 1; // Arbitrary delta (for determining zoom in/out) based on scaling factor
var returnedValues = panAndZoom.changeZoom(paper.view.zoom, delta, paper.view.center, paper.view.center, scalingFactor);
paper.view.zoom = returnedValues[0];

และนี่คือวิธี panAndZoom.changeZoom:

SimplePanAndZoom.prototype.changeZoom = function(oldZoom, delta, centerPoint, offsetPoint, zoomFactor) {
    var newZoom = oldZoom;
    if (delta < 0) {
        newZoom = oldZoom * zoomFactor;
    }
    if (delta > 0) {
        newZoom = oldZoom / zoomFactor;
    }

    var a = null;
    if(!centerPoint.equals(offsetPoint)) {
        var scalingFactor = oldZoom / newZoom;
        var difference = offsetPoint.subtract(centerPoint);
        a = offsetPoint.subtract(difference.multiply(scalingFactor)).subtract(centerPoint);
    }

    return [newZoom, a];
};

มีความคิดบ้างไหมว่าทำไมมันถึงซูมให้พอดีแต่เสียศูนย์กลางไป?


person Scotty H    schedule 07.10.2015    source แหล่งที่มา


คำตอบ (1)


TL;DR

ใช้อย่างใดอย่างหนึ่ง แต่ไม่ใช่ทั้งสองอย่าง:

  • หลังจากการซูม:

      paper.view.setCenter(0,0);
    
  • เมื่อวางรูปภาพ:

      var raster = new paper.Raster(image, new paper.Point(canvas.width/2, canvas.height/2));
    

คำตอบยาว

ตามข้อจำกัดความรับผิดชอบ ฉันต้องชี้ให้เห็นว่าฉันไม่มีความรู้เกี่ยวกับ paper.js และเอกสารของพวกเขาดูแย่มาก คำตอบนี้เกิดจากการเล่นซอ

ฉันจำลองโค้ดของคุณไม่มากก็น้อย และหลังจากซ่อมแซม ฉันก็จัดการเพื่อแก้ไขปัญหาโดยใช้สิ่งนี้:

paper.view.zoom = returnedValues[0];
paper.view.setCenter(0,0);

หากคุณสงสัยว่าทำไมฉันไม่ชี้ไปที่เอกสารประกอบสำหรับ setCenter นั่นเป็นเพราะฉันหาไม่พบ ฉันค้นพบวิธีการนั้นโดยการตรวจสอบ paper.view.center

แม้ว่าฉันจะไม่พอใจกับสิ่งที่ฉันไม่เข้าใจว่าทำไมสิ่งนี้ถึงได้ผล ด้วยเหตุนี้ ฉันจึงดูโค้ดของคุณต่อไปและสังเกตเห็นสิ่งนี้:

// Add image to Paper.js canvas
var raster = new paper.Raster(image, new paper.Point(0,0));

เอกสารประกอบสำหรับ raster บอกเราดังต่อไปนี้:

แรสเตอร์

สร้างรายการแรสเตอร์ใหม่จากอาร์กิวเมนต์ที่ส่ง และวางไว้ในเลเยอร์ที่ใช้งานอยู่ วัตถุอาจเป็นรูปภาพ DOM, Canvas หรือสตริงที่อธิบาย URL ที่จะโหลดรูปภาพ หรือ ID ขององค์ประกอบ DOM เพื่อรับรูปภาพ (อาจเป็นรูปภาพ DOM หรือ Canvas)

พารามิเตอร์:

แหล่งที่มา: HTMLImageElement / HTMLCanvasElement / String — แหล่งที่มาของแรสเตอร์ — ไม่บังคับ

ตำแหน่ง: จุด — ตำแหน่งกึ่งกลางสำหรับวางรายการแรสเตอร์ — ไม่บังคับ

ความเข้าใจของฉันคือภาพถูกวางบนผืนผ้าใบโดยให้กึ่งกลางอยู่ที่ตำแหน่ง 0,0 หรือที่เรียกว่า มุมซ้ายบน จากนั้นเนื้อหาของผืนผ้าใบจะถูกปรับขนาด แต่ขึ้นอยู่กับตำแหน่งกึ่งกลางของมันเอง วิธีนี้จะดึงภาพให้เข้าใกล้กึ่งกลางผืนผ้าใบมากขึ้น แต่ก็ยังมีความคลาดเคลื่อนอยู่

การตั้งค่าศูนย์กลางเป็น 0,0 เพียงประสานจุดกึ่งกลางของทั้งรูปภาพและผืนผ้าใบ

ยังมีอีกวิธีหนึ่งคือวางรูปภาพไว้ที่กึ่งกลางผืนผ้าใบปัจจุบัน ซึ่งดูเหมาะสมกว่า:

// Add image to Paper.js canvas
var raster = new paper.Raster(image, new paper.Point(canvas.width/2, canvas.height/2));

นี่คือ JSFiddle เบื้องต้นสำหรับการทดลอง

person spenibus    schedule 13.10.2015