Nowe tutaj na Stackoverflow. Pracuję nad rozwiązaniem, w którym można zapisać przycięte zdjęcie przy użyciu jcrop na serwerze jako plik .jpg. Obraz jest również używany jako tekstura na powierzchni sześcianu (używam do tego pliku three.js). Nie jestem zawodowym koderem, ale udało mi się uzyskać obraz na powierzchni i zapisać go na serwerze.Jak zwiększyć DPI przy zapisywaniu płótna na serwerze jako plik jpg?
ALE, niestety, pliki mają zawsze rozdzielczość 96 DPI i mają niską jakość (nawet przy rozdzielczości 2000px X 2000px). Próbowałem znaleźć rozwiązanie i wciąż mam nadzieję znaleźć coś bardziej współczesnego. Słyszałem na przykład o metodzie toDataURLHD
. Próbowałem, ale to nie zadziałało.
Oto mój kod JavaScript do wysyłania serwera:
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);
}
a część 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);
}
Kod działa, pojawia się obraz na serwerze, ale jakość jest słaba :
Czy istnieje sposób na zwiększenie rozdzielczości?
EDIT:
Mój kod jest trochę skomplikowane, ponieważ użyłem zasobów zewnętrznych. Tag canvas został "ukryty" na przykład. Oto także kod procedury ładowania.
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>
Więc tutaj nie mogłem znaleźć żadnych tagów płótnie. Ale wiem, że został wygenerowany i znalazłem go w pliku .js w funkcji "Iconcontroller".
EDIT2:
Chyba znalazłem część gdzie mam go zmodyfikować. Próbowałem metody canvas.width=img.width*300/96
, ale coś nie działa. Może kod nie znajduje się w odpowiednim miejscu.
Tutaj pełny kod. Opiekować się RESIZING AND UPLOAD
i update image canvas
części:
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();}
};
}
});
}
Stworzyłem także plik zip z kodów, ponieważ istnieją pewne bibliotekami. Here is the link.
Edit3:
nie wiem gdzie odpowiedź od Marke poszedł, ale w każdym razie. Rozwiązanie było miłe, mam nadzieję, że uda mi się zaimplementować go do mojego kodu. Dziękuję za twoje wysiłki, naprawdę to doceniam, ponieważ jestem tu nowy i nawet nie spodziewałem się uzyskać żadnej odpowiedzi. :)
Musisz tylko przesłać oryginalny obraz bez żadnych modyfikacji, w ten sposób nie stracisz jakości ani nie wprowadzisz niepożądanych artefaktów. Zmiana rozmiaru obrazu spowoduje utworzenie artefaktów i będzie różna dla różnych konfiguracji sprzętowych i przeglądarek Nie można poprawić jakości obrazu, więc jeśli jest on przeznaczony do druku, należy go zaakceptować tak, jak jest, i pozwolić sterownikom drukarki obsługiwać DPI, ponieważ ich oprogramowanie jest znacznie lepiej jako dostosowanie pikseli do kropek. – Blindman67
Po przeczytaniu tego spróbowałem coś znaleźć. Miałem zdjęcia, które miały dobrą jakość, ale także niską rozdzielczość, na przykład 96 lub nawet niższą. Ale w każdym razie, kiedy je zbieram, wszystkie są rozmyte później. Dlaczego? Obraz jest zawsze eksportowany do 96 dpi, nawet jeśli ma większą lub mniejszą rozdzielczość. Zakładam też, że powinien on zachować odpowiednią jakość, ale tak się nie dzieje. Myślę, że klucz ma coś wspólnego z jcropem, że zapewnia niestety niską jakość obrazu ... :( – PLAYCUBE