Вход

Просмотр полной версии : Canvas зеркально отражение!


Severtain
19.09.2011, 17:44
Всем привет!:victory:

Наткнулся на одну проблемку. Есть изображения которые используються несколько раз, однако их нужно зеркально отразить по горизонтали!
Как это сделать на Canvas'e???

DjDiablo
19.09.2011, 18:16
Вот ссылка на вертикальное отражение
http://www.digitalia.be/file_download/14/reflection-jquery.zip (http://www.digitalia.be/file_download/14/reflection-jquery.zip)
подключается
<img src="test.jpg" alt="" class="reflect" />
затем
$("#gallery img").reflect();
тоже самое но с параметрами
$('#gallery img').reflect({height:0.4, opacity:0.75}); // высота 40%, непрозрачность 0.75

думаю переписать труда не составит.


На горизонтальное отражение переделать дело 5-15 минут.

Severtain
19.09.2011, 18:23
А средствами канвас как я понимаю, это не возможно? :)

Gozar
19.09.2011, 18:35
А средствами канвас как я понимаю, это не возможно? :)
возможно, поищи на mdc про канвас

Sweet
19.09.2011, 18:36
А средствами канвас как я понимаю, это не возможно?
Этот reflect работает с помощью канвас:)

nikita.mmf
19.09.2011, 18:45
https://developer.mozilla.org/en/Canvas_tutorial/Transformations

DjDiablo
19.09.2011, 18:55
Обучалка.
http://w3pro.ru/article/html-5-canvas-dlya-nachinayushchikh

dmitriymar
19.09.2011, 19:11
горизонтальное отражение
var razmer=parseInt(elem_kanva.width/2)
var cnvobj=document.getElementById(elem_kanva.name_can );
var ctx=cnvobj.getContext("2d");
for (i=0;i<=razmer;i++)
{
imgd = ctx.getImageData(i,0, 1, elem_kanva.height);
imgd1 = ctx.getImageData((elem_kanva.width-i),0, 1, elem_kanva.height);
ctx.putImageData(imgd, (elem_kanva.width-i), 0);
ctx.putImageData(imgd1, i, 0);
}

вертикальное отражение
var razmer=parseInt(elem_kanva.height/2);
var cnvobj=document.getElementById(elem_kanva.name_can );
var ctx=cnvobj.getContext("2d");
for (i=0;i<=razmer;i++)
{
imgd = ctx.getImageData(0,i, elem_kanva.width, 1);
imgd1 = ctx.getImageData(0,(elem_kanva.height-i), elem_kanva.width, 1);
ctx.putImageData(imgd, 0, (elem_kanva.height-i));
ctx.putImageData(imgd1, 0, i);
}

Severtain
19.09.2011, 19:15
всем спасибо! буду пробывать!!! :)

DjDiablo
19.09.2011, 19:23
Выпил кофе и из любопытства переделал плагин. Правда под IE непеределывал. Но в остальных нормуль
/*!
reflection.js for jQuery v1.1
(c) 2006-2011 Christophe Beyls <http://www.digitalia.be>
MIT-style license.
*/

(function($) {

$.fn.extend({
reflect: function(options) {
options = $.extend({
height: 1/3,
opacity: 0.5
}, options);

return this.unreflect().each(function() {
var img = this;
if (/^img$/i.test(img.tagName)) {
function doReflect() {
var imageWidth = img.width, imageHeight = img.height, reflection, reflectionHeight, wrapper, context, gradient;
reflectionHeight = Math.floor((options.height > 1) ? Math.min(imageHeight, options.height) : imageHeight * options.height);

reflection = $("<canvas />")[0];
if (reflection.getContext) {
context = reflection.getContext("2d");
try {
//11
$(reflection).attr({width: imageWidth, height: imageHeight});
context.save();

// отсчитываем по x не от нуля, а наоборот от значения равной ширине изображения
context.translate(imageWidth, 0);
context.scale(-1, 1);

// рисуем картинку отражение
context.drawImage(img, 0, 0, imageWidth, imageHeight);
context.restore();
context.globalCompositeOperation = "destination-out";

//рисуем градиент поверх картинки
gradient = context.createLinearGradient(0, 0, imageWidth,0);
gradient.addColorStop(0, "rgba(255, 255, 255, " + (1 - options.opacity) + ")");
gradient.addColorStop(1, "rgba(255, 255, 255, 1.0)");
context.fillStyle = gradient;
context.rect(0, 0, imageWidth, imageHeight);
context.fill();
} catch(e) {
return;
}
} else {
if (!$.browser.msie) return;
reflection = $("<img />").attr("src", img.src).css({
width: imageWidth,
height: imageHeight,
marginBottom: reflectionHeight - imageHeight,
filter: "FlipV progid:DXImageTransform.Microsoft.Alpha(Opacity=" + (options.opacity * 100) + ", FinishOpacity=0, Style=1, StartX=0, StartY=0, FinishX=0, FinishY=" + (reflectionHeight / imageHeight * 100) + ")"
})[0];
}
//я изменил display чтобы изображения в врапере встали вряд
$(reflection).css({display: "inline", border: 0});

wrapper = $(/^a$/i.test(img.parentNode.tagName) ? "<span />" : "<div />").insertAfter(img).append([img, reflection])[0];
wrapper.className = img.className;
$.data(img, "reflected", wrapper.style.cssText = img.style.cssText);

//изменение ширины враппера(вместо Y, теперь меняем X)
$(wrapper).css({width: imageWidth*2, height: imageHeight, overflow: "hidden"});

//я изменил display чтобы изображения в врапере встали вряд
img.style.cssText = "display: inline; border: 0px";

img.className = "reflected";
}

if (img.complete) doReflect();
else $(img).load(doReflect);
}
});
},

unreflect: function() {
return this.unbind("load").each(function() {
var img = this, reflected = $.data(this, "reflected"), wrapper;

if (reflected !== undefined) {
wrapper = img.parentNode;
img.className = wrapper.className;
img.style.cssText = reflected;
$.removeData(img, "reflected");
wrapper.parentNode.replaceChild(img, wrapper);
}
});
}
});

})(jQuery);

dmitriymar
19.09.2011, 20:19
а вообще что мешает считать полностью картинку из канвы?
и вернуть её в канву но разница в том что началом ставим конец канвы ,а концом начало. должно сработать и всего 4 строки
var cnvobj=document.getElementById(elem_kanva.name_can );
var ctx=cnvobj.getContext("2d");
imgd = ctx.getImageData(0,0, elem_kanva.width, elem_kanva.height);
ctx.putImageData(imgd,elem_kanva.width,elem_kanva. height,-elem_kanva.width,-elem_kanva.height );
пробуй должно развернуть по идее

DjDiablo
19.09.2011, 20:42
Забавно. Но похоже если развернёт, то содержимое окажется за границами видимости. мне отчего-то кажется что контейнер вслед за твоими манипуляциями растягиваться небудет. К томуже если исходное и развёрнутое изображение будет в канве, это как минимум лишит возможности сохранить картинку, ибо содержимое канвы не сохраняется обычно.

Да и на IE как я понял, совсем другая технология.

Хотя я только 5 минут на канвас потратил, поверхностно по теме пробежался, так что могу ошибаться.

Severtain
19.09.2011, 20:46
dmitriymar,
Интересная идея.. нужно будет попробывать!

dmitriymar
19.09.2011, 21:07
вобщем перевые два примера полностью рабочие-на моём проекте работают.
К томуже если исходное и развёрнутое изображение будет в канве, это как минимум лишит возможности сохранить картинку, ибо содержимое канвы не сохраняется обычно.

содержимое всегда прерывается-если пиксел попадает на пиксел ,то он его замещает в режиме по умолчанию.

для ие технология такаяже -в ие работает это. только до 8 включительно нужно библиотеку подключать. я не помню размер абсолютный или смещение задаётся при размещении изображения на канве- если абсолютный то не сработает-поскольку размер изображения не может быть минус.

DjDiablo, зачем сохранять исходное изображение если оно нужно перевёрнутым? ну а по второму ,то я там написал чтоб попробовал-поскольку я не помню как размеры берутся.
абсолютные.
а в выводах ты ошибся-не за пределами. а просто не будет поскольку ширина и высота изображения меньше 0 пикселов. а если бы смещение было,как в половине свойств канвы-то всё было бы норм

m~r.Nemo
15.12.2014, 00:02
Такой вопрос, а возможно ли отразить зеркально текст, чтобы каждый символ отображался зеркально но не меняя порядок символов? Или повернуть каждый символ на 180°?

Одним словом в юникоде есть символ «©» копирирайта, но нету символа копилефта, есть шрифты с засечками, например «Таймс», значит надо отразить по горизонтали, есть шрифты без засечек, например «Ариал», значит можно отразить и можно повернуть на 180°