Ihatid ang kinakailangang impormasyon sa mga gustong kliyente. Ang pangunahing problema sa mga benta ay ang kawalan ng kakayahan na ihatid ang iyong halaga sa mga customer. Paano maayos na pag-usapan ang tungkol sa isang produkto o serbisyo

Isaalang-alang natin ang tatlo mga simpleng paraan, na maaaring gamitin upang ipakita lamang ang bahagi ng isang imahe sa isang website. Tandaan na sa mga pamamaraang ito ang imahe ay hindi na-crop sa isang tiyak na laki sa literal, ngunit ipinapakita lamang ang bahagi na kailangan nating makita at itatago ang hindi kinakailangang lugar.

Ang mga paraang ito ay maaaring maging lubhang kapaki-pakinabang kung kailangan mong baguhin ang laki ng isang imahe o lumikha ng isang preview, halimbawa, sa isang news feed, atbp.

Paraan 1: Paggamit ng Mga Negatibong Margin

Ang imahe ay dapat ilagay sa isang elemento ng magulang, sa aming kaso ay isang div. Ang parent element ay dapat na isang floated element (o may tinukoy na lapad). Ang pamamaraan ay hindi gagana sa block-level o full-width na mga elemento.

Magtakda tayo ng mga negatibong margin para sa lahat ng apat na panig: itaas (itaas), kanan (kanan), ibaba (ibaba) at kaliwa (kaliwa). Tinutukoy ng mga negatibong margin kung gaano kalaki ang na-crop ng larawan ng pangunahing elemento sa bawat direksyon. Susunod, itatakda namin ang overflow property ng parent element na nakatago upang itago ang mga margin na nasa likod ng na-crop na lugar ng larawan.

    <div class = "crop" >

    I-crop

    lumutang pakaliwa;

    overflow: nakatago;

    I-crop ang img

    margin : -70px -50px -160px -175px ;

Paraan 2: Paggamit ng ganap na pagpoposisyon

Gamit ang pamamaraang ito, itinakda namin ang lapad at taas ng elemento ng magulang, at itinakda ang katangian ng posisyon sa kamag-anak. Tinutukoy ng lapad at taas ang mga sukat ng ipinapakitang field. Para sa isang imahe sa loob ng parent element, itakda ang positioning property sa absolute. Pagkatapos, gamit ang itaas at kaliwang mga katangian, itinakda namin kung aling bahagi ng larawan ang ipapakita.

    <div class = "crop" >

    I-crop

    lumutang pakaliwa;

    overflow: nakatago;

    posisyon: kamag-anak;

    lapad: 270px;

    taas: 260px;

    I-crop ang img

    posisyon: ganap;

    itaas: -70px;

    kaliwa: -175px;

Paraan 3: Paggamit ng slip property

Ang pamamaraang ito ang pinakasimple, dahil tinutukoy ng clip property ang bahagi ng elementong kailangang ipakita. Ngunit ang pamamaraang ito ay may dalawang kawalan.

Una, ang na-crop na elemento ay dapat na ganap na nakaposisyon. Kaya kailangan nating magdagdag ng karagdagang elemento, kalkulahin ang laki ng nakikitang lugar ng larawan, idagdag ang laki na iyon, at itakda ang float property sa magulang.

Pangalawa, ang laki ng nakikitang lugar ay hindi nababawasan sa laki ng ginupit na bahagi, ngunit nananatiling katumbas ng laki ng buong imahe (ang lugar sa labas ng ginupit na bahagi ay nakatago lamang). Dapat nating gamitin ang ganap na pagpoposisyon upang ilipat ang nakikitang lugar sa kaliwang sulok sa itaas ng magulang.

    <div class = "crop" >

    I-crop

    lumutang pakaliwa;

    posisyon: kamag-anak;

Matutunan kung paano baguhin ang laki at i-crop ang mga larawan gamit ang JavaScript at ang HTML5 Canvas element, gamit ang mga kontrol na nakita mo sa mga app sa pag-edit ng larawan:

Sa artikulong ito, ipapakita ko sa iyo kung paano baguhin ang laki at i-crop ang mga larawan gamit ang HTML5 element , at dahil ginagawa na natin iyon, gawin din natin ang mga cool na kontrol sa pagbabago ng laki ng larawan na madalas mong nakikita sa mga app sa pag-edit ng larawan.

Sa isang live na kapaligiran, maaaring gamitin ng isang website o app ang diskarteng ito upang baguhin ang laki at gumawa ng larawan sa profile bago mag-load.

Magagawa namin ito sa server, gayunpaman, mangangailangan ito ng paglilipat ng mga potensyal na malalaking file, na magtatagal ng maraming oras. Sa halip, maaari naming baguhin ang laki ng imahe sa panig ng kliyente bago pa man ito ma-load. Na magpapahintulot sa iyo na gawin ang lahat nang mas mabilis.

Para magawa ito gagawa kami ng HTML5 element at i-output ang larawan sa canvas sa isang partikular na laki, at pagkatapos ay kunin ang bagong data ng larawan mula sa canvas bilang URI data.

Sinusuportahan na ng karamihan sa mga browser ang mga pamamaraang ito, kaya malamang na maipatupad mo kaagad ang diskarteng ito. Gayunpaman, kailangan mong magkaroon ng kamalayan sa ilang mga limitasyon na hindi sinusuportahan ng mga browser, tulad ng kalidad ng imahe at pagganap.

Ang pag-resize ng napakalaking larawan ay maaaring maging sanhi ng pagbagal ng browser, o sa ilang mga kaso ay nag-crash pa ang application. Samakatuwid, makatuwirang magtakda ng mga makatwirang limitasyon sa laki ng file na maaaring i-upload. Kung mahalaga sa iyo ang kalidad, maaari mong makitang hindi naaangkop ang diskarteng ito dahil babawasan ng browser ang kalidad ng larawan habang pinoproseso.

Umiiral isang bilang ng mga diskarte na maaaring magamit upang mapataas ang kalidad ng mga larawang na-scale mula sa canvas, gayunpaman, hindi namin isasaalang-alang ang mga ito sa artikulong ito.

Maaari mong makita ang huling resulta sa demo na ito, o maaari mong i-download ang ZIP archive.

Well, ngayon magsimula tayo!

Pagmamarka

Sa aming demo, magsisimula kami sa isang umiiral na larawan:

Iyon lang! Ito lang ang HTML na kakailanganin namin para sa demo na ito.

CSS

Ang CSS ay napakaliit din. Una, tukuyin natin ang mga istilo para sa lalagyan ng pagbabago ng laki at larawan:

I-resize-container ( position: relative; display: inline-block; cursor: move; margin: 0 auto; ) .resize-container img ( display: block ) .resize-container:hover img, .resize-container:active img ( outline: 2px dashed rgba(222,60,80,.9 )

Baguhin ang laki-handle-ne, .resize-handle-ne, .resize-handle-se, .resize-handle-nw, .resize-handle-sw ( posisyon: absolute; display: block; lapad: 10px; taas: 10px; background: rgba(222,60,80,.9); z-index: 999; ( ibaba: -5px; kaliwa: -5px; cursor: sw-resize; ) .resize-handle-ne ( top: -5px; right: -5px; cursor: ne-resize; ) .resize-handle-se ( ibaba : -5px; kanan: -5px;

JavaScript

Sinimulan namin ang JavaScript sa pamamagitan ng pagtukoy sa ilang mga variable at pagsisimula ng Canvas at ang target na imahe:

var resizeableImage = function(image_target) ( var $container, orig_src = new Image(), image_target = $(image_target).get(0), event_state = (), constrain = false, min_width = 60, min_height = 60, max_width = 800, max_height = 900, resize_canvas = document.createElement("canvas" )); resizeableImage($(".resize-image"));

Susunod na lumikha kami ng isang init function na tatawagin kaagad sa boot. Binabalot ng function na ito ang larawan sa isang lalagyan, gumagawa ng mga hawakan ng pagbabago ng laki, at gumagawa ng kopya ng orihinal na larawan na ginagamit para sa pagbabago ng laki.

Itinalaga rin namin ang JQuery object para sa container element sa isang variable para ma-access namin ito sa ibang pagkakataon at magdagdag ng mousedown event listener na nakakakita kapag may nagsimulang mag-drag sa isa sa mga handle:

var resizeableImage = function(image_target) ( // ... init = function())( // Lumikha ng bagong imahe na may kopya ng orihinal na src // Kapag binago namin ang laki ng imahe, palagi naming ginagamit ang kopyang ito bilang batayan orig_src .src=image_target.src ; // Magdagdag ng pagbabago ng laki ng mga marker $(image_target).wrap("

").bago(" ").bago(" ").pagkatapos(" ").pagkatapos(" "); // Kumuha ng mga variable para sa container $container = $(image_target).parent(".resize-container"); // Magdagdag ng mga event $container.on("mousedown", ".resize-handle", startResize) ; ); //... sa loob();

Ang startResize at endResize function ay nagsasabi lamang sa browser na simulan ang pagsubaybay kung saan gumagalaw ang mouse at ihinto ang pagsubaybay:

startResize = function(e)( e.preventDefault(); e.stopPropagation(); saveEventState(e); $(document).on("mousemove", resize); $(document).on("mouseup", endResize ); endResize = function(e)( e.preventDefault(); $(document).off("mouseup touchend", endResize); $(document).off("mousemove touchmove", resize); );

Bago natin simulan ang pagsubaybay sa posisyon ng mouse, kailangan nating kumuha ng snapshot ng mga sukat at iba pang pangunahing data ng lalagyan.

Iniimbak namin ang mga ito sa isang variable na tinatawag na event_state at ginagamit ito sa ibang pagkakataon bilang panimulang punto kapag binabago ang taas at lapad:

saveEventState = function(e)( // I-save ang mga paunang parameter ng event at ang estado ng container event_state.container_width = $container.width(); event_state.container_height = $container.height(); event_state.container_left = $container .offset().left ; event_state.container_top = $container.offset().top; event_state.mouse_x = (e.clientX || e.pageX || e.originalEvent.touches.clientX) + $(window).scrollLeft (); = (e.clientY || e.pageY || e.originalEvent.touches.clientY) + $(window).scrollTop(); // Ito ay isang patch para sa mobile safari // Para sa ilang kadahilanan, hindi ito magagawa direktang kopyahin ang mga katangian ng pagpindot kung (uri ng e.originalEvent.touches !== "undefined")( event_state.touches = ; $.each(e.originalEvent.touches, function(i, ob)( event_state.touches[i] = ( ); event_state.touches [i].clientX = 0+ob.clientX; event_state.touches[i].clientY = 0+ob.clientY ));

Ang pagpapalit ng laki ng function ay kung saan nangyayari ang karamihan sa mga aksyon. Ang function na ito ay patuloy na tinatawag kapag ang user ay nag-drag ng isa sa mga sizing handle. Sa tuwing tatawagin ang function na ito, lumikha kami ng bagong lapad at taas sa pamamagitan ng pagkalkula ng kaugnayan sa pagitan ng kasalukuyang posisyon ng mouse at ang orihinal na posisyon ng sulok na hinila ng user:

pagbabago ng laki = function(e)( var mouse=(),lapad,taas,kaliwa,itaas,offset=$container.offset(); mouse.x = (e.clientX || e.pageX || e.originalEvent.touches .clientX) + $(window).scrollLeft(); mouse.y = (e.clientY || e.pageY || e.originalEvent.touches.clientY) + $(window).scrollTop(); x - event_state.container_left; taas = mouse.y - event_state.container_left; itaas = event_state.container_top; && taas > min_height && lapad< max_width && height < max_height){ resizeImage(width, height); // Без этого Firefox не будем пересчитывать размеры изображения, пока перетаскивание не завершилось $container.offset({"left": left, "top": top}); } }

Pagkatapos ay nagdaragdag kami ng opsyon upang limitahan ang laki ng larawan kapag lumipat gamit ang Shift key o isang variable.

Sa wakas, binabago namin ang imahe, ngunit kung ang bagong lapad at taas ay nasa loob ng minimum at maximum na mga halaga ng mga variable na itinakda namin sa simula.

Tandaan: Dahil talagang binabago namin ang laki ng imahe, hindi lang ang mga katangian ng taas at lapad, maaari mong isaalang-alang ang paglilimita kung gaano kadalas matatawag ang resizeImage para sa mga dahilan ng pagganap. Ito ay tinatawag na debouncing o throttling.

Aktwal na pagbabago ng laki ng larawan

Maaari ka lamang gumuhit ng isang imahe gamit ang drawImage. Itinakda muna namin ang taas at lapad ng canvas at palaging ginagamit ang orihinal na kopya ng full-size na imahe. Pagkatapos ay ginagamit namin ang toDataURL sa canvas upang makakuha ng Base64 na naka-encode na bersyon ng kamakailang binagong larawan at ilagay ito sa pahina.

Ang seksyon sa clipping ay nagbibigay ng kumpletong paliwanag para sa lahat ng mga opsyon na magagamit sa paraan ng drawImage:

resizeImage = function(lapad, taas)( resize_canvas.width = width; resize_canvas.height = taas; resize_canvas.getContext("2d").drawImage(orig_src, 0, 0, lapad, taas); $(image_target).attr( "src", resize_canvas.toDataURL("image/png") );

Masyadong madali? May isang maliit na caveat: ang imahe ay dapat na naka-host sa parehong domain bilang ang pahina, o sa isang server na may kakayahang makipagpalitan sa iba't ibang pinagmumulan ng pinagmulan (CORS). Kung hindi, maaari kang magkaroon ng mga problema sa mga error " nasirang canvas«.

Pag-resize mula sa iba't ibang anggulo

Dapat ay mayroon ka na ngayong gumaganang demo na bersyon. Ngunit hindi lang iyon. Naka-on sa sandaling ito, hindi pa ito gumagana para mangyari ang pagbabago ng laki na para bang kinakaladkad natin ang kanang sulok sa ibaba, kahit saang sulok tayo nagre-resize ng imahe.

Kailangan nating baguhin ang laki ng imahe mula sa anumang anggulo. Para magawa ito kailangan nating maunawaan ang gawi ng ating demo model.

Kapag binabago ang laki, ang sulok na dina-drag namin, pati na rin ang mga katabing gilid nito, ay dapat na gumalaw, habang ang kabaligtaran na sulok at ang mga katabing gilid nito ay dapat manatili sa lugar:

Kapag binago namin ang lapad at taas ng isang imahe, ang kanan at ibabang mga gilid ay lilipat, habang ang itaas at kaliwang mga gilid ay mananatili sa lugar. Nangangahulugan ito na bilang default, ang mga imahe ay binago mula sa kanang sulok sa ibaba.

Hindi namin mababago ang default na gawi na ito, ngunit kapag nag-resize mula sa anumang sulok maliban sa kanang bahagi sa ibaba maaari naming baguhin pangkalahatang posisyon imahe upang lumilitaw na parang ang kabaligtaran na sulok at katabing mga gilid ay nananatili sa lugar. I-update natin ang ating pagpapalit ng laki ng function:

pagbabago ng laki = function(e)( var mouse=(),lapad,taas,kaliwa,itaas,offset=$container.offset(); mouse.x = (e.clientX || e.pageX || e.originalEvent.touches .clientX) + $(window).scrollLeft(); mouse.y = (e.clientY || e.pageY || e.originalEvent.touches.clientY) + $(window).scrollTop(); depende sa iba't ibang anggulo sa pag-drag namin if($(event_state.evnt.target).hasClass("resize-handle-se"))( width = mouse.x - event_state.container_left; height = mouse.y - event_state .container_top; left = event_state.container_left; top = event_state.container_top; ) else if($(event_state.evnt.target).hasClass("resize-handle-sw"))( width = event_state.container_width - (mouse.x - event_state. container_left); taas = mouse.y - event_state.container_top; left = mouse.x; = event_state.container_width - (mouse.x - event_state.container_left); taas ng event_state.container_height - (mouse.y - event_state.container_top); kaliwa = mouse.x; tuktok = mouse.y; if(constrain || e.shiftKey)( top = mouse.y - ((width / orig_src.width * orig_src.height) - height); ) ) else if($(event_state.evnt.target).hasClass("resize -handle-ne"))( lapad = mouse.x - event_state.container_left; taas = event_state.container_height - (mouse.y - event_state.container_top); kaliwa = event_state.container_left; tuktok = mouse.y; kung(pigilan | |. orig_src.width * orig_src.height ) if(width > min_width && height > min_height && width< max_width && height < max_height){ // Для увеличения производительности вы можете ограничить количество вызовов resizeImage() resizeImage(width, height); // Без этого Firefox не будет пересчитывать размеры изображения, пока перетаскивание не завершилось $container.offset({"left": left, "top": top}); } }

Sinusuri na ngayon ng aming code kung aling resize-handle ang dina-drag at ginagalaw ang aming imahe upang ang kaukulang sulok ay lalabas na manatiling nakatigil.

Paglipat ng Imahe

Ngayon na maaari naming baguhin ang laki ng isang imahe sa pamamagitan ng pag-drag sa alinman sa mga sulok nito, maaaring napansin mo na maaari naming hindi sinasadyang baguhin ang posisyon ng larawan sa pahina.

Ngayon kailangan nating tiyakin na ang imahe ay bumalik sa gitna ng frame. Sa init function, magdagdag tayo ng isa pang tracker ng kaganapan, katulad ng ginawa natin kanina:

init = function())( //... $container.on("mousedown", "img", startMoving); )

Ngayon ay idinagdag namin ang startMoving at endMoving function, katulad ng kung paano namin idinagdag ang startResize at endResize:

startMoving = function(e)( e.preventDefault(); e.stopPropagation(); saveEventState(e); $(document).on("mousemove", moving); $(document).on("mouseup", endMoving ); endMoving = function(e)( e.preventDefault(); $(document).off("mouseup", endMoving); $(document).off("mousemove", moving); );

Ang gumagalaw na function ay kailangang kalkulahin ang isang bagong posisyon para sa itaas na kaliwang gilid ng lalagyan. Ito ay magiging katumbas ng kasalukuyang posisyon ng mouse, na na-offset ng distansya mula sa kaliwang sulok sa itaas hanggang sa mouse noong sinimulan naming i-drag ang imahe:

gumagalaw = function(e)( var mouse=(); e.preventDefault(); e.stopPropagation(); mouse.x = (e.clientX || e.pageX) + $(window).scrollLeft(); mouse .y = (e.clientY || e.pageY) + $(window).scrollTop(); $container.offset(( "left": mouse.x - (event_state.mouse_x - event_state.container_left), "top" : mouse.y - (event_state.mouse_y - event_state.container_top) ));

Pag-crop ng larawan

Ngayon na maaari naming baguhin ang laki ng imahe, maaari mong i-crop ito. Sa halip na bigyan ang mga user ng opsyon na i-crop ang larawan sa anumang laki at hugis, gumawa tayo ng frame na may eksaktong sukat na kailangan natin at imbitahan ang mga user na ilagay ang larawan sa loob ng frame na iyon.

Magagawa nilang matukoy ang sukat at posisyon ng na-crop na frame sa orihinal na imahe, at kami naman, ay makatitiyak na ang huling imahe ay palaging magkakaroon ng parehong hugis at sukat.

Upang gawin ito kailangan naming idagdag ang sumusunod na HTML code:

Napakahalaga ng mga istilo para sa overlay na frame, lalo na ang posisyon, lapad at taas, dahil ginagamit ang mga ito upang matukoy kung gaano karami ang i-crop.

Mahalaga rin na tandaan na ang frame ay dapat palaging nakikita laban sa isang background ng anumang kulay. Iyon ang dahilan kung bakit sa aking halimbawa gumamit ako ng isang semi-transparent na puting outline sa paligid ng pangunahing window:

Overlay ( posisyon: absolute; kaliwa: 50%; tuktok: 50%; margin-left: -100px; margin-top: -100px; z-index: 999; lapad: 200px; taas: 200px; border: solid 2px rgba( 222,60,80,.9); box-sizing: content-box; pointer-events: none; ; taas: 40px sa kaliwa: putol-putol na 2px rgba(222,60,80,.9); margin-top: -40px ) .overlay:after ( bottom: 0; margin-left: -2px; margin-bottom: -40px; ) .overlay-inner:after, .overlay -inner:before ( content: ""; posisyon: absolute; display: bloke; ); .overlay-inner:before ( left: 0; margin-left: -40px; margin-top: -2px; ) .overlay-inner:after ( right: 0; margin-right: -40px; margin-top: -2px) .btn-crop ( position: absolute; vertical-align: bottom; kanan: 5px; ibaba: 5px; padding: 6px 10px; z-index: 999; kulay ng background: rgb(222,60,80); hangganan: wala; hangganan-radius: 5px; kulay: #FFF; )

Idagdag ang sumusunod na function at tracker ng kaganapan sa iyong JavaScript:

init = function())( //... $(".js-crop").on("click", crop); ); crop = function())( var crop_canvas, left = $(".overlay").offset().left - $container.offset().left, top = $(".overlay").offset().top - $container.offset().top, width = $(".overlay").width(), height = $(".overlay").height(); crop_canvas = document.createElement("canvas"); = lapad; crop_canvas.height = taas; crop_canvas.getContext("2d").drawImage(image_target, kaliwa, itaas, lapad, taas, 0, 0, lapad, taas.open("image / png"));)

Ang crop function ay katulad ng resizeImage function, ngunit sa halip na ipasa ito sa isang taas at lapad na halaga, makuha namin ang taas at lapad mula sa elemento ng overlay.

Ang paraan ng drawImage ng canvas ay nangangailangan ng siyam na parameter para sa pag-crop. Ang unang parameter ay ang pinagmulan ng larawan. Ang susunod na apat na parameter ay nagpapahiwatig kung gaano karami sa orihinal na larawan ang ginagamit (ang clipping box). Ang huling apat na parameter ay nagpapahiwatig kung saan sa canvas ipapakita ang larawan at sa anong laki.

Pagdaragdag ng Touch Events

Para sa mousedown at mouseup mayroong katumbas na touch event - touchstart at touchend, para sa mousemov mayroong katumbas na touchmove event. Ang sinumang nagpangalan sa mga kaganapang ito ay malinaw na walang sense of humor, kung hindi, maaaring tinawag niya itong "touchdown" at "touchup".

Idagdag natin ang touchstart at touchend saanman mayroon tayong mousedown at mouseup , at palitan natin ang mousemove ng touchmove :

// Sa init()... $container.on("mousedown touchstart", ".resize-handle", startResize); $container.on("mousedown touchstart", "img", startMoving); //In startResize() ... $(document).on("mousemove touchmove", moving); $(document).on("mouseup touchend", endMoving); //In endResize()... $(document).off("mouseup touchend", endMoving); $(document).off("mousemove touchmove", gumagalaw); //In startMoving()... $(document).on("mousemove touchmove", moving); $(document).on("mouseup touchend", endMoving); //Sa endMoving()... $(document).off("mouseup touchend", endMoving); $(document).off("mousemove touchmove", gumagalaw);

Dahil nire-resize namin ang larawan, makatuwirang asahan na gugustuhin ng ilang user na gumamit ng mga karaniwang pagkilos gaya ng pag-stretch ng larawan. Mayroong Hammer library na naglalaman ng maraming maginhawang tool para sa pagtatrabaho sa mga touch event.

Pero dahil stretching lang ang kailangan natin, kaya natin nang wala ito. Ngayon ay ipapakita ko sa iyo kung gaano kadali ang gumawa ng stretch nang hindi gumagamit ng third-party na library.

Maaaring napansin mo na ang saveEventState function ay nag-iimbak na ng orihinal na touch data; kakailanganin natin ito ngayon.

Una, tinitingnan namin kung ang kaganapan ay naglalaman ng dalawang "pagpindot" at sukatin ang distansya sa pagitan ng mga ito. Minarkahan namin ito bilang paunang distansya, at pagkatapos ay sukatin kung gaano kalaki ang pagbabago sa distansyang ito habang kami ay gumagalaw. I-update natin ang gumagalaw na function:

gumagalaw = function(e)( var mouse=(), touches; e.preventDefault(); e.stopPropagation(); touches = e.originalEvent.touches; mouse.x = (e.clientX || e.pageX || touches.clientX) + $(window).scrollLeft(); mouse.y = (e.clientY || e.pageY || touches.clientY) + $(window).scrollTop((" left": mouse.x - (event_state.mouse_x - event_state.container_left), "top": mouse.y - (event_state.mouse_y - event_state.container_top) )); // Subaybayan ang stretching habang gumagalaw if(event_state.touches && event_state .touches.length > 1 && touches.length > 1)( var width = event_state.container_width, taas = event_state.container_height; var a = event_state.touches.clientX - event_state.touches.clientX; a = a * a; var b = event_state.touches.clientY - event_state.touches.clientY; var dist1 = Math.sqrt(a + b); - touches.clientY; b = b * b; var ratio = dist2 /dist1; lapad = lapad * ratio; taas = taas * ratio; // Upang mapabuti ang pagganap, maaari mong limitahan ang bilang ng mga tawag na i-resizeImage() resizeImage(width, height); ) );

Hinahati namin ang kasalukuyang distansya sa paunang distansya upang matukoy ang ratio at ilapat ito nang naaayon sa sukat ng imahe. Kinakalkula namin ang bagong lapad at taas at pagkatapos ay i-resize ang imahe:

Iyon lang. Panoorin muli ang demo na bersyon o i-download ang ZIP archive.

Sa pagsubok, nakita ko na hinaharangan ng Chrome ang default na browser mula sa pagtugon sa pag-stretch, ngunit gumagana nang maayos ang Firefox.

Umaasa ako na nakita mong kapaki-pakinabang ang artikulong ito. Hinihikayat kita na basahin ang iba pang mga artikulo sa mga na-draggable na elemento at mga paraan ng pag-upload ng file, at tingnan kung paano pinagsasama-sama ng ibang tao ang mga diskarteng ito upang lumikha ng magagandang user interface.

Ang publikasyong ito ay pagsasalin ng artikulong “ PAGBABAGO AT PAG-CROP NG MGA LARAWAN SA CANVAS", na inihanda ng magiliw na pangkat ng proyekto

Sa artikulong ito, matututuhan natin kung paano baguhin ang laki at i-crop ang mga larawan gamit ang isang elemento sa HTML5, at habang ginagawa natin ito, bigyan natin ang mga kontrol ng naka-istilong disenyo tulad ng sa mga editor ng larawan.

Sa ngayon, maraming mga website at web application ang nilagyan ng teknolohiya sa pagpoproseso ng imahe. Magagawa ito sa panig ng server, na magkakaroon ng mga gastos sa oras para sa pagdadala ng potensyal na malaking larawan. Upang maiwasan ito, maaari mong iproseso ang mga larawan sa makina ng kliyente upang mapabilis ang proseso.

Gagawin namin ito sa pamamagitan ng canvas, iguhit ang mga larawan sa nais na laki, pagkatapos ay kukuha ng mga bagong larawan. Sinusuportahan ng maraming browser ang pamamaraang ito, kaya maaari tayong magsimula kaagad sa mga maliliit na limitasyon sa pagganap.

Maaaring pabagalin ng pag-format ng malalaking larawan ang browser o maging sanhi ito ng tuluyang paghinto. Dahil dito, iniisip natin ang tungkol sa pagtatakda ng mga limitasyon sa mga na-upload na larawan. Kung mahalaga ang kalidad ng mga resultang larawan, maaaring mabigla tayo sa kung ano ang ginagawa ng browser sa kanila. Maaari kang makahanap ng ilang mga teknolohiya sa Internet upang mapabuti ang kalidad ng pagproseso ng imahe, ngunit hindi namin isasaalang-alang ang mga ito dito.

Sa layuning ito, kami ay nagsisimula sa trabaho!

Pagmamarka

Sa aming demo ay gagana kami sa isang ibinigay na larawan:

Lahat! Hindi namin kailangan ng anumang iba pang HTML.

CSS

Ang CSS code ay hindi rin magiging napakalaki. Tukuyin natin ang mga istilo para sa resize-container at ang mismong larawan.

I-resize-container ( position: relative; display: inline-block; cursor: move; margin: 0 auto; ) .resize-container img ( display: block ) .resize-container:hover img, .resize-container:active img ( outline: 2px dashed rgba(222,60,80,.9 )

Ngayon, itakda natin ang mga posisyon at istilo para sa bawat 'resize handles'. Ito ay mga maliliit na parisukat na matatagpuan sa mga sulok ng mga larawan na aming i-drag upang baguhin ang laki ng imahe.

Baguhin ang laki-handle-ne, .resize-handle-ne, .resize-handle-se, .resize-handle-nw, .resize-handle-sw ( posisyon: absolute; display: block; lapad: 10px; taas: 10px; background: rgba(222,60,80,.9); z-index: 999; ( ibaba: -5px; kaliwa: -5px; cursor: sw-resize; ) .resize-handle-ne ( top: -5px; right: -5px; cursor: ne-resize; ) .resize-handle-se ( ibaba : -5px; kanan: -5px;

JavaScript

Magsimula tayo sa paggawa ng variable at canvas sa Canvas.

Var resizeableImage = function(image_target) ( var $container, orig_src = new Image(), image_target = $(image_target).get(0), event_state = (), constrain = false, min_width = 60, min_height = 60, max_width = 800, max_height = 900, resize_canvas = document.createElement("canvas" )); resizeableImage($(".resize-image"));

Ngayon, gumawa tayo ng trigger function na tatakbo kaagad. Gumagana ang function na ito sa lalagyan kung saan nasa loob ang imahe, nagtatakda ng laki at kinokopya ang orihinal na larawan para sa pag-crop. Nagtatalaga din kami ng isang jQuery object upang ma-reference namin ito sa ibang pagkakataon at gumamit ng mga operator ng mouse move upang tumugon sa mga pag-drag ng mouse.

Var resizeableImage = function(image_target) ( // ... init = function())( // Lumikha ng bagong imahe na may kopya ng orihinal na src // Kapag binabago ang laki, palagi naming gagamitin ang orihinal na kopyang ito bilang base orig_src. src =image_target.src; // Magdagdag ng resize handle $(image_target).wrap("

").bago(" ").bago(" ").pagkatapos(" ").pagkatapos(" "); // Kumuha ng variable para sa container $container = $(image_target).parent(".resize-container"); // Magdagdag ng mga kaganapan $container.on("mousedown", ".resize-handle", startResize); ); //... sa loob(); )

Ang startResize at endResize function ay nagsasabi sa browser kung kailan magsisimulang bigyang pansin ang paggalaw ng mouse at kung kailan titigil.

StartResize = function(e)( e.preventDefault(); e.stopPropagation(); saveEventState(e); $(document).on("mousemove", resize); $(document).on("mouseup", endResize ); endResize = function(e)( e.preventDefault(); $(document).off("mouseup touchend", endResize); $(document).off("mousemove touchmove", resize); );

Bago mo simulan ang pagsubaybay sa mouse, dapat mong i-scan ang kasalukuyang mga setting ng kliyente kapag humihiling ng pahina. iniimbak namin ang mga ito sa variable na event_state at ginagamit ang mga ito sa ibang pagkakataon sa aming trabaho.

SaveEventState = function(e)( // I-save ang mga unang detalye ng event at container state event_state.container_width = $container.width(); event_state.container_height = $container.height(); event_state.container_left = $container.offset(). left; event_state.container_top = $container.offset().top; event_state.mouse_x = (e.clientX || e.pageX || e.originalEvent.touches.clientX) + $(window).scrollLeft(); (e.clientY || e.pageY || e.originalEvent.touches.clientY) + $(window).scrollTop(); // Ito ay isang pag-aayos para sa mobile safari // Sa ilang kadahilanan ay hindi nito pinapayagan ang isang direktang kopya ng touches property if(typeof e.originalEvent.touches !== "undefined")( event_state.touches = ; $.each(e.originalEvent.touches, function(i, ob)( event_state.touches[i] = ( ); event_state.touches[i].clientX = 0+ob.clientX; event_state.touches[i].clientY = 0+ob.clientY ));

Ang pagpapalit ng laki ng function ay ang pinakamahalaga. Ito ay isinaaktibo kapag ang imahe ay nakaunat. Sa bawat oras na kinakalkula namin ang mga bagong laki ng imahe depende sa bagong posisyon ng mga parisukat.

Pagbabago ng laki = function(e)( var mouse=(),lapad,taas,kaliwa,itaas,offset=$container.offset(); mouse.x = (e.clientX || e.pageX || e.originalEvent.touches .clientX) + $(window).scrollLeft(); mouse.y = (e.clientY || e.pageY || e.originalEvent.touches.clientY) + $(window).scrollTop(); x - event_state.container_left; taas = mouse.y - event_state.container_left; itaas = event_state.container_top; && taas > min_height && lapad< max_width && height < max_height){ resizeImage(width, height); // Without this Firefox will not re-calculate the the image dimensions until drag end $container.offset({"left": left, "top": top}); } }

Susunod, magdaragdag kami ng opsyon upang limitahan ang laki ng larawan gamit ang Shift key o isang variable.

tala: Dahil talagang binabago namin ang imahe sa halip na bigyan lamang ito ng bagong haba at taas, sulit na isipin kung gaano namin magagamit ang resizeImage function upang kontrolin ang pagganap ng server.

Mga bagong laki ng larawan

Ang pagguhit ng mga larawan sa Canvas ay kasingdali ng drawImage . Itinakda namin ang taas at haba ng larawan, at pagkatapos ay ibigay ang orihinal. Ginagamit din namin ang toDataURL upang makakuha ng Base64-encoded na bersyon ng resulta ng operasyon.

Ang buong paliwanag ng mga opsyon na magagamit para sa operasyong ito ay ibinigay.

ResizeImage = function(lapad, taas)( resize_canvas.width = width; resize_canvas.height = taas; resize_canvas.getContext("2d").drawImage(orig_src, 0, 0, lapad, taas); $(image_target).attr( "src", resize_canvas.toDataURL("image/png") );

Masyadong madali? May isang caveat: ang larawan ay dapat na naka-host sa parehong domain bilang aming pahina, o ang . Kung hindi ito ang kaso, magkakaroon ka ng mga problema sa 'tainted canvas'.

Tumataas sa pamamagitan ng iba pang mga vertex

Dapat ay mayroon ka na ngayong gumaganang demo. Pero hindi pa tapos. Sa ngayon maaari lamang nating i-stretch ang imahe sa isang sulok, ngunit gusto naming gamitin ang lahat ng apat. Upang gawin ito, kailangan mong maunawaan kung paano ito gumagana.

Kapag iniunat namin ang imahe, ang mga sulok na katabi ng hawak na sulok ay dapat ding lumipat, ngunit ang kabaligtaran na dulo ng imahe ay dapat na maayos.

Maaari naming baguhin ang code upang kapag ang imahe ay nakaunat sa anumang anggulo, ito ay nagbabago. I-update natin ang pagpapalit ng laki ng function:

Pagbabago ng laki = function(e)( var mouse=(),lapad,taas,kaliwa,itaas,offset=$container.offset(); mouse.x = (e.clientX || e.pageX || e.originalEvent.touches .clientX) + $(window).scrollLeft(); mouse.y = (e.clientY || e.pageY || e.originalEvent.touches.clientY) + $(window).scrollTop(); naiiba depende sa sulok na na-drag at mga hadlang kung($(event_state.evnt.target).hasClass("resize-handle-se"))( width = mouse.x - event_state.container_left; height = mouse.y - event_state.container_top ; left = event_state.container_left; top = event_state.container_top; ) else if($(event_state.evnt.target).hasClass("resize-handle-sw"))( width = event_state.container_width - (mouse.x - event_state .container_left); taas = mouse.y - event_state.container_top; lapad = event_state.container_width - (mouse.x - event_state.container_left); event_state.container_height - (mouse.y - event_state.container_top); kaliwa = mouse.x; tuktok = mouse.y; if(constrain || e.shiftKey)( top = mouse.y - ((width / orig_src.width * orig_src.height) - height); ) ) else if($(event_state.evnt.target).hasClass("resize -handle-ne"))( lapad = mouse.x - event_state.container_left; taas = event_state.container_height - (mouse.y - event_state.container_top); kaliwa = event_state.container_left; tuktok = mouse.y; kung(pigilan | |. orig_src.width * orig_src.height ) if(width > min_width && height > min_height && width< max_width && height < max_height){ // To improve performance you might limit how often resizeImage() is called resizeImage(width, height); // Without this Firefox will not re-calculate the the image dimensions until drag end $container.offset({"left": left, "top": top}); } }

Ngayon ay sinusuri namin kung aling resize-handle ang ginamit at ilapat ang mga kinakailangang pagbabago.

Paglipat ng Imahe

Ngayon na maaari na nating baguhin ang laki ng larawan, maaaring napansin mo na minsan ay "lumalabas" ito. Kinakailangang magdagdag ng kakayahang ilipat ang isang bagay sa gitna ng frame. Palawakin natin nang kaunti ang function ng pagsisimula.

Init = function())( //... $container.on("mousedown", "img", startMoving); )

Ngayon ay nagdaragdag kami ng mga function na startMoving at endMoving, katulad ng startResize at endResize.

StartMoving = function(e)( e.preventDefault(); e.stopPropagation(); saveEventState(e); $(document).on("mousemove", moving); $(document).on("mouseup", endMoving ); endMoving = function(e)( e.preventDefault(); $(document).off("mouseup", endMoving); $(document).off("mousemove", moving); );

Sa gumagalaw na pag-andar dapat nating gawin ang posisyon ng itaas na kaliwang parisukat. Dapat itong katumbas ng paunang isa na may maliit na offset na kinakalkula mula sa paggalaw ng iba pang mga parisukat.

Moving = function(e)( var mouse=(); e.preventDefault(); e.stopPropagation(); mouse.x = (e.clientX || e.pageX) + $(window).scrollLeft(); mouse .y = (e.clientY || e.pageY) + $(window).scrollTop(); $container.offset(( "left": mouse.x - (event_state.mouse_x - event_state.container_left), "top" : mouse.y - (event_state.mouse_y - event_state.container_top) ));

Pag-crop ng larawan

Ngayon na natutunan namin kung paano baguhin ang laki, kailangan naming magdagdag ng pag-crop ng imahe. Sa halip na hayaan ang mga user na mahirapan ang mga laki ng crop, gumawa na lang tayo ng frame na kailangang ilagay sa tamang lugar at lahat ay i-crop sa paligid nito. Ito ay magbibigay sa kanila ng pagkakataong ayusin ang imahe gayunpaman gusto nila, habang kasabay nito ay ginagawang magkatulad ang laki ng mga resultang imahe.

Upang gawin ito kailangan mong idagdag ang sumusunod na HTML code:

Mahalagang tandaan na ang frame ay dapat palaging ibang kulay mula sa background ng pahina, kung hindi, maaaring magkaroon ng mga problema.

Overlay ( posisyon: absolute; kaliwa: 50%; tuktok: 50%; margin-left: -100px; margin-top: -100px; z-index: 999; lapad: 200px; taas: 200px; border: solid 2px rgba( 222,60,80,.9); box-sizing: content-box; pointer-events: none; ; taas: 40px sa kaliwa: putol-putol na 2px rgba(222,60,80,.9); margin-top: -40px ) .overlay:after ( bottom: 0; margin-left: -2px; margin-bottom: -40px; ) .overlay-inner:after, .overlay -inner:before ( content: ""; posisyon: absolute; display: bloke; ); .overlay-inner:before ( left: 0; margin-left: -40px; margin-top: -2px; ) .overlay-inner:after ( right: 0; margin-right: -40px; margin-top: -2px) .btn-crop ( position: absolute; vertical-align: bottom; kanan: 5px; ibaba: 5px; padding: 6px 10px; z-index: 999; kulay ng background: rgb(222,60,80); hangganan: wala; hangganan-radius: 5px; kulay: #FFF; )

I-update din natin ang JavaScript code:

Init = function())( //... $(".js-crop").on("click", crop); ); crop = function())( var crop_canvas, left = $(".overlay").offset().left - $container.offset().left, top = $(".overlay").offset().top - $container.offset().top, width = $(".overlay").width(), height = $(".overlay").height(); crop_canvas = document.createElement("canvas"); = lapad; crop_canvas.height = taas; crop_canvas.getContext("2d").drawImage(image_target, kaliwa, itaas, lapad, taas, 0, 0, lapad, taas.open("image / png"));)

Ang crop function ay katulad ng resizeImage. Ang pagkakaiba lang ay nakukuha natin ang mga sukat at posisyon ng pag-crop mula sa posisyon ng frame.

Para mag-crop, kailangan mong magtakda ng siyam na parameter sa drawImage operator sa canvas. Ang una ay ang orihinal na imahe. Ang susunod na apat ay ang mga lugar na ginamit para sa operasyon. Ang isa pang apat ay ang mga coordinate ng lugar kung saan dapat mong simulan ang pagguhit sa canvas, at kung anong laki ng imahe.

Pagdaragdag ng touch at gesture recognition

Gumawa kami ng suporta sa mouse. Huwag nating ipagkait sa ating sarili ang atensyon at mga mobile device.

Para sa mousedown at mouseup mayroong mga katumbas na operator - touchstart at touchend, at para sa mousemove mayroong touchmove. Kailangan mong mag-ingat na huwag malito ang mga ito sa touchup at touchdown (kung hindi, ito ay magiging nakakatawa).

Idagdag natin ang touchstart at touchend kung saan man mayroon tayong mousedown , at mouseup kasama ang touchmove kung saan man mayroon tayong mousemove .

// Sa init()... $container.on("mousedown touchstart", ".resize-handle", startResize); $container.on("mousedown touchstart", "img", startMoving); //In startResize() ... $(document).on("mousemove touchmove", moving); $(document).on("mouseup touchend", endMoving); //In endResize()... $(document).off("mouseup touchend", endMoving); $(document).off("mousemove touchmove", gumagalaw); //In startMoving()... $(document).on("mousemove touchmove", moving); $(document).on("mouseup touchend", endMoving); //Sa endMoving()... $(document).off("mouseup touchend", endMoving); $(document).off("mousemove touchmove", gumagalaw);

Dahil nakakonekta kami sa mga mobile device, may posibilidad na gamitin ng user ang kilos na "pag-ipit" sa larawan gamit ang kanyang mga daliri upang gawin itong mas maliit. Mayroong isang napaka-maginhawang library na tinatawag na Hammer, na nagbibigay-daan sa iyong makilala ang maraming kilos. Ngunit, dahil isa lang ang kailangan namin, isusulat namin ito nang maikli nang walang anumang karagdagang mga script.

Maaaring napansin mo na ang function na saveEventState ay nakaimbak na sa impormasyon ng pagpindot. Ngayon ay kakailanganin natin ito.

Una naming suriin para sa pagkakaroon ng "dalawang pagpindot" at ang distansya sa pagitan ng mga ito. Tinitingnan din namin kung ang distansya sa pagitan nila ay bumababa habang kami ay gumagalaw. Ngayon, i-update natin ang paglipat:

Moving = function(e)( var mouse=(), touches; e.preventDefault(); e.stopPropagation(); touches = e.originalEvent.touches; mouse.x = (e.clientX || e.pageX || touches.clientX) + $(window).scrollLeft(); mouse.y = (e.clientY || e.pageY || touches.clientY) + $(window).scrollTop((" left": mouse.x - (event_state.mouse_x - event_state.container_left), "top": mouse.y - (event_state.mouse_y - event_state.container_top) )); // Panoorin ang pinch zoom gesture habang gumagalaw kung(event_state. touches && event_state.touches.length > 1 && touches.length > 1)( var width = event_state.container_width, taas = event_state.container_height; var a = event_state.touches.clientX - event_state.touches.clientX; a = a * a ; var b = event_state.touches.clientY - event_state.touches.clientY; b; var dist2 = Math.sqrt(a + b); var ratio = dist2 /dist1; lapad = lapad * ratio; taas = taas * ratio; // Upang mapabuti ang pagganap maaari mong limitahan kung gaano kadalas ang resizeImage() ay tinatawag na resizeImage(width, height); ) );

Batay sa data na ito, binabawasan o pinalaki namin ang aming imahe at inaayos ang taas at haba nito.

Iyon lang. Maaari mong buksan

Kamusta sa lahat, ang pangalan ko ay Anna Blok at ngayon ay pag-uusapan natin kung paano mag-crop ng mga imahe nang hindi gumagamit ng mga programa ng graphics.

Saan ito maaaring maging kapaki-pakinabang?

Una sa lahat, sa mga site kung saan ang content na may mga larawan ay malamang na hindi ma-crop para sa anumang partikular na block.

Isang kapansin-pansing halimbawa: blog sa WordPress.

Sabihin nating gusto mong magkaroon ng 1:1 (kuwadradong) aspect ratio ang pabalat ng iyong artikulo. Ang iyong mga aksyon:

  1. Mag-download ng angkop na larawan mula sa Internet;
  2. I-crop ito sa Photoshop sa nais na mga sukat;
  3. Mag-publish ng isang artikulo.

Kapag binisita mo ang site, makikita mo ang resulta na iyong inaasahan.

Ngunit, ipagpalagay na nakalimutan mong i-crop ang imahe sa Photoshop at nag-download ng isang random na imahe bilang isang pabalat mula sa Internet, ano ang mangyayari pagkatapos?! Tama, masisira ang layout. At kung hindi mo pa nagagamit ang CSS, maaaring ganap na i-block ng isang HD na imahe ang buong view ng text. Samakatuwid, mahalagang malaman kung paano mag-crop ng mga larawan gamit ang mga estilo ng CSS.

Tignan natin iba't ibang sitwasyon kung paano ito maipapatupad hindi lamang gamit ang CSS, kundi pati na rin ang SVG.

Halimbawa 1

Subukan nating i-crop ang larawang inilagay gamit ang background-image. Gumawa tayo ng kaunting HTML markup

Lumipat tayo sa CSS styling. Gamit ang background-image nagdaragdag kami ng isang imahe, tukuyin ang mga frame para sa aming imahe, igitna ang imahe gamit ang background-position at itakda ang background-size:

jpg); background-position:center center; background-size:cover; lapad:300px; taas:300px; )

Ito ang una at pinakasimpleng paraan para sa pag-crop ng isang imahe. Ngayon tingnan natin ang pangalawang halimbawa.

Halimbawa 2

Ipagpalagay na mayroon pa rin tayong parehong lalagyan ng kahon sa loob kung saan mayroong isang img tag na may isang imahe na iistilo natin ngayon.

Isentro rin natin ang ating imahe na may kaugnayan sa bagay na gagawin natin. At gumagamit kami ng property na medyo bihirang gamitin: object-fit .

Box ( position: relative; overflow:hidden; width:300px; height:300px; ) .box img ( position: absolute; top:50%; left:50%; transform:translate(-50%,-50%); lapad:300px; taas:300px;

Sa aking opinyon ito ay pinakamahusay na paraan. Ito ay perpekto para sa mga blog kung gumagamit ka ng mga larawan ng ganap na magkakaibang mga proporsyon para sa mga post.

Maaari kang matuto nang higit pa tungkol sa HTML at CSS dito:

Halimbawa 3

Maaari din tayong gumawa ng pag-crop para sa mga larawan sa ngayon kung ilalagay natin ang mga ito sa mga elemento ng SVG. Kunin natin ang isang bilog bilang isang halimbawa. Maaari tayong lumikha ng SVG gamit ang mga tag. Gumawa ng svg border tag na maglalaman ng circle tag at pattern na tag sa loob. Sa pattern tag isinulat namin ang image tag. Sa loob nito ay tinukoy namin ang xlink:href attribute at magdagdag ng isang imahe. Magdaragdag din kami ng mga katangian ng lapad at taas. Ngunit hindi lang iyon. Kakailanganin naming idagdag ang halaga ng punan. Para maituring na kumpleto ang aming trabaho, idaragdag namin ang preserveAspectRatio auxiliary attribute sa image tag, na magbibigay-daan sa aming punan ang aming larawan "mula simula hanggang matapos" sa buong bilog.

Hindi ko matatawag na unibersal ang pamamaraang ito. Ngunit maaari itong magamit sa mga pambihirang kaso. Halimbawa, kung hawakan natin ang paksa ng isang blog, kung gayon ang pamamaraang ito ay mainam na magkasya sa avatar ng may-akda na sumulat ng artikulo.

Maaari kang matuto nang higit pa tungkol sa HTML at CSS dito:

Mga resulta:
Tumingin kami sa 3 paraan ng pag-crop ng mga larawan sa mga website: gamit ang background-image, gamit ang img tag at nauugnay sa svg pattern sa pag-embed ng mga bitmap na larawan gamit ang image tag. Kung alam mo ang anumang iba pang mga pamamaraan para sa pag-crop ng isang imahe gamit ang SVG, pagkatapos ay ibahagi ang mga ito sa mga komento. Ito ay magiging kapaki-pakinabang hindi lamang para sa akin, kundi pati na rin para sa iba na malaman ang tungkol sa kanila.

Huwag kalimutang tanungin ang iyong mga tanong tungkol sa layout o front-end development mula sa mga propesyonal sa FrontendHelp online.

Kapag naghahanda ng mga larawan para sa WEB, madalas na kinakailangan na i-crop ang mga ito upang i-highlight ang mga kinakailangang bahagi ng larawan at putulin ang mga hindi kailangan. Bukod sa puro masining na mga paghuhusga, ang gayong pag-trim o, kung tawagin din, pag-crop, ay kailangan upang bawasan ang laki ng file. Kung mas maliit ang larawan, mas maliit ang laki ng file nito, at mas mabilis itong mag-load sa pahina ng WEB.

Paano alisin ang mga hindi kinakailangang bahagi ng isang imahe

Tingnan natin kung paano aktwal na ginagawa ang pag-crop sa pamamagitan ng pag-alis ng makitid na itim na guhit sa ibabang gilid ng larawan, na hindi sapat na magaan. Ang pag-crop ay ginagawa gamit ang isang espesyal na tool, Crop Tool (C).

I-click ang pindutan ng Crop Tool (C) sa panel ng Tools upang piliin ang tool na ito.

Itakda ang iyong mouse pointer sa hugis sa kaliwang sulok sa itaas ng larawan.

I-click at hawakan ang kaliwang pindutan ng mouse.

Nang hindi binibitawan ang kaliwang pindutan ng mouse, ilipat ang pointer ng mouse sa ibaba ng kanang gilid ng larawan upang ang tuldok-tuldok na frame ng pagpili na lilitaw ay hindi kasama ang isang makitid na itim na guhit sa ibabang hangganan ng larawan.

Bitawan ang kaliwang pindutan ng mouse. Mala-lock ang frame at lilitaw ang mga square marker sa mga sulok nito at sa gitna ng mga gilid. Ang lugar ng imahe sa labas ng crop frame ay magdidilim, kaya ipahiwatig ang bahagi ng larawan na tina-crop.

Gamit ang mga marker na ito maaari mong ayusin at paikutin ang hangganan ng frame. Para ilipat ang cropping frame, ilagay lang ang mouse pointer sa loob ng napiling lugar at i-drag ito sa kinakailangang espasyo. Upang baguhin ang laki ng napiling lugar, ilipat ang isa sa mga handle ng sulok. Kung pipigilan mo ang pindutan ng Shift habang gumagalaw, ang mga proporsyon ng lugar ay mapapanatili. Upang paikutin ang frame, ilagay ang mouse pointer, na magiging hugis ng isang hubog na arrow, sa labas ng lugar ng pagpili at, sa pamamagitan ng paggalaw ng mouse, maabot ang isang angkop na posisyon para sa frame. Upang kanselahin ang pag-crop, pindutin lamang ang Esc button.

Sa pamamagitan ng paggalaw sa mga handle ng selection frame, tiyaking kasama sa cropping frame ang buong larawan, hindi binibilang ang makitid na itim na guhit sa ibabang hangganan ng larawan.

I-double click sa loob ng crop box o pindutin ang Enter. Ang larawan ay i-crop sa nakatakdang hangganan.

Paano bawasan ang laki ng larawan

Ngunit kahit na pagkatapos i-crop ang larawan ay medyo malaki para sa isang pahina ng WEB. Sa resolution ng screen na 800 x 600 pixels (at ayon sa statistics, karamihan sa mga user ng Web ay kasalukuyang gumagana sa resolution na ito), ang larawan ay kumukuha ng malaking espasyo sa display. Bilang karagdagan, ang isang file ng imahe na ganito ang laki ay magiging malaki at magtatagal upang mai-load. Samakatuwid, babawasan namin ang laki ng imahe, na, sa turn, ay bawasan ang laki ng file.

Piliin ang menu command na Imahe - Laki ng Larawan. Ang dialog na Laki ng Imahe ay lilitaw sa display.

Sa pinakamataas na bahagi ng dialog, sa pangkat ng mga bahagi ng kontrol Mga Dimensyon ng Pixel (Dimensyon sa mga pixel), ang kasalukuyang laki ng file sa format na PSD ay ipinahiwatig - 400.3K, pati na rin ang kasalukuyang lapad (Lapad) at taas (Taas) ng ang imahe sa mga pixel. Ang iyong mga halaga pagkatapos ng pag-crop ay maaaring bahagyang naiiba.

Sa pangkat ng kontrol na Sukat ng Dokumento, ang laki ng dokumento sa sentimetro at ang graphic na resolution nito (Resolution) ay ipinahiwatig. Kapag nakatakda ang flag ng Constrain Proportions, awtomatikong pinapanatili ng program ang mga proporsyon ng imahe kapag binabago ang isa sa mga sukat - lapad o taas.

Kapag binago mo ang laki ng isang imahe sa pangkat ng Mga Dimensyon ng Pixel ng mga bahagi ng kontrol, ang mga katangian nito para sa dokumento ay nagbabago nang naaayon - alinman sa mga dimensyon o graphic na resolution nito, depende sa kung ang bandila ng Resample Image ay may check o na-clear. Kung ang flag na ito ay nakatakda, ang laki ng dokumento at, nang naaayon, ang laki ng file ng imahe ay nagbabago. Kung na-clear ang flag, ang mga sukat lamang ng dokumento ang maaaring baguhin. Sa lahat ng ito, ang graphic na resolution nito ay magbabago nang naaayon, at ang laki ng imahe sa mga pixel at laki ng file ay mananatiling walang configuration.

Kapag binabawasan ang dimensyon o graphic na resolution Adobe Photoshop nag-aalis ng super-redundant na impormasyon mula sa imahe, at kapag nadagdagan ang mga katangiang ito, bumubuo ito ng nawawalang impormasyon batay sa mga halaga ng kulay ng mga umiiral na pixel. Sa parehong mga kaso, ang program ay gumagamit ng isa sa 5 interpolation na paraan, na maaaring piliin sa Resample Image drop-down na listahan.

Dahil ang larawan na ang laki ay gusto naming baguhin ay nilikha para ipakita sa display, ang graphic na resolution nito ay hindi dapat baguhin.

Tiyaking naka-check ang Resample Image checkbox upang mapanatili ang graphic na resolution ng larawan at baguhin ang laki nito.

Sa Width input field ng Pixel Dimensions group ng mga control parts, maglagay ng bagong value para sa lapad ng imahe sa pixels - 300. Awtomatikong magbabago ang value ng taas ng imahe sa Height input field, pati na rin ang laki ng dokumento sa Laki ng Dokumento control part group ( Sukat ng dokumento). Sa itaas na bahagi ng dialog ay makakakita ka rin ng bago, pinababang halaga ng laki ng file at sa tabi nito, sa mga bracket, ang nakaraang volume.

Isara ang dialog na Laki ng Larawan sa pamamagitan ng pag-click sa OK. Ang mga tinukoy na katangian ay gagamitin at ang laki ng imahe sa window ng dokumento ay mababawasan.

Paano maiiwasan ang pagkawala ng mga katangian ng imahe kapag nire-resize ito

Gaya ng nasabi na, ang pagbabawas ng dimensyon ng isang imahe ay nag-aalis ng sobrang kalabisan na impormasyon mula dito, na humahantong sa isang tiyak na pagbaba sa sharpness. Ang paggamit ng Unsharp Mask filter ay maaaring maibalik ang sharpness ng imahe sa isang tiyak na lawak.

Piliin ang menu command na Filter - Sharpen - Unsharp Mask (Filter - Sharpness - Contour sharpness). Ang dialog ng Unsharp Mask ay lalabas sa display.

Ilipat ang slider ng Halaga upang ibalik ang talas ng larawan. Ang halaga ng parameter na ito ay dapat nasa loob ng 50-60%.

I-click ang OK para isara ang Urisharp Mask dialog. Ang imahe ay magiging mas matalas.

I-save ang dokumento sa pamamagitan ng pagpili sa menu command na File - Save.

Dahil kapag binabago ang laki ng isang imahe, bumababa ang kalidad nito dahil sa pag-alis ng hindi kinakailangang impormasyon, dapat na iwasan ang operasyong ito kung maaari. Kung nag-i-scan ka ng isang imahe, mas mahusay na hanapin ang laki nito sa hakbang na ito at mag-scan sa isang resolution na magbibigay ng pinakamahusay na kalidad ng display.