2016-06-21 3 views
1

私はキャンバスアプリケーションを作成しようとしています。私はちょうどキャンバスの出力である印刷イメージにこだわった。画像のサイズが小さすぎて十分に印刷できません。キャンバスから印刷サイズ(300 DPI)でイメージをエクスポート

  1. アップロード画像やキャンバスに描く:

    後は、アプリケーションのフローです。

  2. 分割キャンバスでズーム、移動、回転などの操作を行います。
  3. 私はこれらの分割から1つのイメージを正常に生成しました
  4. そして、私はキャンバスから印刷プロセスにbase64をエクスポートしました。

キャンバスからデータをエクスポートするときの問題は、最終画像の画質をリサイズするImagickのものをポスターで印刷することができない場合でも、小さな画像です。

はJavaScript:

function draw() { 
    var Activecanvas = document.getElementsByClassName("cf-photoframe-active"); 
    var canvas = Activecanvas[0]; 
    var ctx = canvas.getContext('2d'); 
    var ActiveCanvasId = canvas.getAttribute("id"); 
    var img = canvasDetail[ActiveCanvasId].selectedImage; 
    var imageX = canvasDetail[ActiveCanvasId].imageX; 
    var imageY = canvasDetail[ActiveCanvasId].imageY; 
    var resize = resizeDetail[ActiveCanvasId].resize; 
    var rotate = rotateDetail[ActiveCanvasId].rotate; 
    //if(resize) 
    $j("#resize").slider({ 
    value: resize, 
    min: -300, 
    max: 300, 
    step: 1, 
    }); 
    $j("#rotat").slider({ 
    value: rotate, 
    min: -180, 
    max: 180, 
    step: 1, 
    }); 
    if (img != '') { 
    ctx.clearRect(0, 0, canvas.width, canvas.height); 
    ctx.save(); 
    var im_width = parseInt(img.width + $j("#resize").slider('value')); 
    var im_height = parseInt(img.height + $j("#resize").slider('value')); 

    var maxWidth = canvas.width; // Max width for the image 
    var maxHeight = canvas.height; 


    var iswidthMax = 0; 
    var imageOrgWidth = img.width; 
    var imageOrgHeight = img.height; 
    if (maxWidth < maxHeight) { 
     iswidthMax = 1; 
    } else if (maxWidth == maxHeight) { 
     iswidthMax = 2; 
    } 

    if (iswidthMax == 1) { 
     maxWidth = (maxHeight * imageOrgWidth)/imageOrgHeight; 

    } else if (iswidthMax == 0) { 
     maxHeight = (maxWidth * imageOrgHeight)/imageOrgWidth; 
    } else if (iswidthMax == 2) { 
     if (img.width > img.height) { 
     maxWidth = (maxHeight * imageOrgWidth)/imageOrgHeight; 
     } else { 
     maxHeight = (maxWidth * imageOrgHeight)/imageOrgWidth; 
     } 
    } 

    var resizeVal = $j("#resize").slider('value'); 
    var nw = maxWidth + resizeVal; 
    var resizeValHeight = maxHeight * resizeVal/maxWidth; 
    var nh = maxHeight + resizeValHeight; 

    ctx.translate(imageX, imageY); 
    ctx.rotate(rotate * Math.PI/180); 
    ctx.translate(-nw/2, -nh/2); 
    ctx.drawImage(img, 0, 0, nw, nh); 
    ctx.setTransform(1, 0, 0, 1, 0, 0); 
    ctx.restore(); 
    } 
} 
+0

は、あなたがそれに描画する前に、あなたのキャンバスのサイズ(幅/高さ)を設定していることを確認してください...次のようなものをやって1枚のより大きなキャンバスにそれらを再結合する必要があります。描画操作の前に必要なサイズにする必要があります。使用しているコードの一部を投稿する必要があります。 – ManoDestra

+0

私は既にHTMLのインライン属性としてサイズ(幅/高さ)を設定しています。ここに私は入れます** Draw ** function – chudasamachirag

+1

いいえ、それは役に立たないです。 JavaScriptを使用して幅と高さを設定する必要があります。 'canvas.width = img.width; canvas.height = img.height; '要素の寸法は、内部データの寸法とは異なります。手動で設定しないと、デフォルトの内部寸法が取得されます。ここでは、特に受け入れられた答えを参照してください:http://stackoverflow.com/questions/4938346/canvas-width-and-height-in-html5 – ManoDestra

答えて

1

編集用に小さいcanvas要素を持っている場合、あなたはフルサイズと出力データであるcanvas要素にそれらの小さなキャンバス要素からのデータを再結合する必要がありますその要素から。

簡潔にするために、画像を4象限にカットし、4つのキャンバス要素canvas [0]〜canvas [3]に描画して編集したとします。その後、

var imgData = []; 
for (var i = 0; i < 4; i++) { 
    var tmpCtx = canvas[i].getContext('2d'); 
    imgData[i] = tmpCtx.getImageData(0, 0, canvas[i].width, canvas[i].height); 
} 

var fullSizeCanvas = document.createElement('canvas'); 
fullSizeCanvas.width = img.width * 2; 
fullSizeCanvas.height = img.height * 2; 

var fullCtx = fullSizeCanvas.getContext('2d'); 
fullCtx.putImageData(imgData[0], 0, 0); 
fullCtx.putImageData(imgData[1], img.width, 0); 
fullCtx.putImageData(imgData[2], 0, img.height); 
fullCtx.putImageData(imgData[3], img.width, img.height); 

var data = fullSizeCanvas.toDataURL(); 
+0

ありがとう@ManoDestra、私はあなたの2番目のコメントに従います。キャンバスにイメージの高さと幅を割り当て、それは私のために働く。 http://stackoverflow.com/questions/4938346/canvas-width-and-height-in-html5 – chudasamachirag

+0

はい、正確です。データとして出力する必要があるキャンバスのサイズは、最終的な操作で最終的に描画するために必要なものです。最初は編集用の小さなキャンバスに画像を切り取ることができますが、ズームするたびに、または最後に、ある時点でエクスポートするためにマスター画像に戻す必要があります。がんばろう! – ManoDestra

関連する問題