Как увеличить DPI при сохранении холста на сервере в виде файла jpg?

Новое здесь, на Stackru. Я работаю над решением, где я могу сохранить обрезанное изображение с помощью jcrop на сервере в виде файла.jpg. Изображение также используется в качестве текстуры на поверхности куба (для этого я использую three.js). Я не профессиональный кодер, но мне удалось вывести изображение на поверхность и сохранить его на сервере.

НО, к сожалению, файлы всегда имеют разрешение 96 DPI и имеют низкое качество (даже с разрешением 2000px X 2000px). Я пытался найти решение, и я все еще надеюсь найти что-то более современное. Я слышал о toDataURLHD метод например. Я попробовал, но это не сработало.

Вот мой код Javascript для загрузки на сервер:

    function saveIt(){
var data_image_1=$('#img_front1_CANVAS_PREVIEW')[0].toDataURL('image/jpeg');
var postData = "canvasData="+data_image_1;
var ajax = new XMLHttpRequest();
ajax.open("POST",'upload.php',true);
ajax.setRequestHeader('Content-Type', 'canvas/upload');
ajax.onreadystatechange=function()
{
    if (ajax.readyState == 4)
    {alert("image saved");}
}
ajax.send(postData);
}

И часть PHP:

if (isset($GLOBALS["HTTP_RAW_POST_DATA"]))
{
    $rawImage=$GLOBALS['HTTP_RAW_POST_DATA'];
    $removeHeaders=substr($rawImage, strpos($rawImage, ",")+1);
    $decode=base64_decode($removeHeaders);
    $fopen = fopen( 'uploads/myImage.jpg', 'wb' );
    fwrite( $fopen, $decode);
    fclose( $fopen );

}

Код работает, я получаю изображение на сервере, но качество оставляет желать лучшего:

Исходное изображение

Обрезанное изображение

Есть ли способ получить больше точек на дюйм?

РЕДАКТИРОВАТЬ:

Мой код немного сложен, так как я использовал внешние ресурсы. Например, тег canvas был "скрыт". Вот также некоторый код процедуры загрузки.

HTML:

<!--Upload Button-->
<img class="email-avatar" id="img_front1" height="64" width="64" src="img.png">

<!--Opens a popup, where the picture is being cropped-->
<div id="popup" class="popup">
<img src="" id="target" alt="Flowers" />
<button  onclick="javascript:$.modal.close();"  class="pure-button primary-button" id="Ready">Ready</button>
</div>

<!--After the cropping this function is called-->

<script>
// icon image search
jQuery(document).ready(function($){
Iconcontroller('img_front1',2000,2000,0);
});
</script>

Поэтому здесь я не смог найти никаких тегов холста. Но я знаю, что он был сгенерирован, и я нашел его в файле.js в функции "Iconcontroller".

EDIT2:

Я думаю, что нашел часть, где я должен изменить это. Я попробовал canvas.width=img.width*300/96 метод, но что-то не работает. Может быть, код не в нужном месте в этом.

Здесь полный код. Смотреть после RESIZING AND UPLOAD а также update image canvas части:

Javascript:

function Iconcontroller(OBJ_ICON_ID,SIZE_W,SIZE_H,SIZES_WH,FUNCTIONCALLBACK){

            // CONSTANTS AUX
            var NAME_OBJECT_CONTROL=OBJ_ICON_ID;
            var NAME_FILE_INPUT=NAME_OBJECT_CONTROL+'_FILES_INPUT';
            var NAME_PREVIEW_CANVAS=NAME_OBJECT_CONTROL+'_CANVAS_PREVIEW';

            var NAME_TARGET_IMG='target';
            var NAME_POPUP_HTML='popup';
            var SIZE_W=SIZE_W;
            var SIZE_H=SIZE_H;
            var SIZES_WH=SIZES_WH;


            $( "#"+NAME_OBJECT_CONTROL).after( '<input  name="'+NAME_FILE_INPUT+'" style="display:none" id="'+NAME_FILE_INPUT+'" type="file" accept="image/jpeg,image/png,image/gif" />' );
            $( "#"+NAME_OBJECT_CONTROL).after( '<canvas id="'+NAME_PREVIEW_CANVAS+'" style="display:none"></canvas>' );
            $('#'+NAME_OBJECT_CONTROL).click(
            function(){
                $('#'+NAME_FILE_INPUT).val("");
                $('#'+NAME_FILE_INPUT).click();
            });

            $('#'+NAME_FILE_INPUT).change(function(e) {
                var file = e.target.files[0];
                ProcessImage(file,NAME_PREVIEW_CANVAS,NAME_TARGET_IMG,NAME_POPUP_HTML,SIZE_W,SIZE_H,SIZES_WH,FUNCTIONCALLBACK);
            });

        }

        function modal(NAME_POPUP_HTML){
                $("#"+NAME_POPUP_HTML).modal({escapeClose: true,clickClose: true,showClose: true});
        }

        //PROCESS AND RESIZE FUNCTION 
        function ProcessImage(file,NAME_PREVIEW_CANVAS,NAME_TARGET_IMG,NAME_POPUP_HTML,SIZE_W,SIZE_H,SIZES_WH,FUNCTIONCALLBACK){

            var NAME_PREVIEW_CANVAS=NAME_PREVIEW_CANVAS;
            var NAME_TARGET_IMG=NAME_TARGET_IMG;
            var NAME_POPUP_HTML=NAME_POPUP_HTML;
            var SIZE_W=SIZE_W;
            var SIZE_H=SIZE_H;

            //RESIZING AND UPLOAD
            canvasResize(file, {
                        width: 710,
                        height: 470,
                        crop: false,
                        quality:100,
                        rotate: 0,
                        callback: function(data, width, height) {
                        // resizing img
                        var span = $('#'+NAME_TARGET_IMG).attr('src',data);
                        // detect crop
                        jcrop_obj= $('#'+NAME_TARGET_IMG).data('Jcrop');
                        // show popup
                        $("#"+NAME_POPUP_HTML).modal({
                                escapeClose: true,
                                clickClose: true,
                                showClose: true
            });
            // si existe para cambiar el crop   
            if (jcrop_obj != null) {$('#'+NAME_TARGET_IMG).data('Jcrop').destroy()}

                                if(SIZES_WH!=1){SIZES_WH=SIZE_W /SIZE_H;}
                                else{SIZES_WH=0;}

                                // crea el jcrop for image
                                $('#'+NAME_TARGET_IMG).Jcrop({
                                    aspectRatio: SIZES_WH,
                                    onChange : updatePreview,
                                    onSelect : updatePreview,
                                    setSelect: [ 0, 0, SIZE_W, SIZE_H]
                                });
                        // update image canvas
                        function updatePreview(c) { 
                                if(parseInt(c.w) > 0) {
                                    var imageObj = $("#"+NAME_TARGET_IMG)[0];
                                    // Show image preview
                                    var canvas = $("#"+NAME_PREVIEW_CANVAS)[0];
                                    canvas.width  = SIZE_W*300/96;
                                    canvas.height = SIZE_H*300/96;
                                    var context = canvas.getContext("2d");                      
                                                    context.drawImage(imageObj, c.x, c.y, c.w, c.h, 0, 0, SIZE_W*300/96, SIZE_H*300/96);
                                                }
                                            if(FUNCTIONCALLBACK){FUNCTIONCALLBACK();}
                                    };

                                }
            });
        }

Я также создал ZIP-файл с кодами, так как есть несколько библиотек. Вот ссылка.

EDIT3:

Не знаю, куда пошел ответ от markE, но все равно. Решение было хорошим, надеюсь, мне удастся внедрить его в мой код. Спасибо за ваши усилия, я действительно ценю это, так как я новичок здесь и даже не ожидал получить ответ.:)

1 ответ

Вам нужно больше пикселей, чтобы получить необходимое разрешение принтера.

Один из способов (как говорит Blindman67) - обрезать исходное изображение и позволить принтеру масштабироваться до необходимого количества пикселей.

Вы также можете добавить пиксели вручную...

Вот как:

Если вам нужно добавить пиксели, вы можете создать второй холст еще большего размера и использовать масштабируемую версию drawImage, чтобы еще больше увеличить обрезанную часть. Возможно, вам придется использовать эту технику, если разрешение исходного изображения не соответствует разрешению принтера.

function scaleUp(img,scale){
    var w=img.width*scale;
    var h=img.height*scale;
    var c=document.createElement('canvas');
    cctx=c.getContext('2d');
    c.width=w;
    c.height=h;
    cctx.drawImage(img,0,0,img.width,img.height,0,0,w,h);
    var img1=new Image();
    img1.src=c.toDataURL('image/jpeg',100);
    document.body.appendChild(img1);
}
Другие вопросы по тегам