Project1

标题: 水平斜切的效果 [打印本页]

作者: 凝望·流年    时间: 2014-7-30 14:26
标题: 水平斜切的效果
各位,流年酱想问大家一个问题
怎样做到类似PS中的水平斜切的效果
就像下图一样,谢谢大家了
(, 下载次数: 78) (, 下载次数: 93)

作者: satgo1546    时间: 2014-7-30 16:53
将图像中的每行向右移动(行数-当前行数)/比例系数像素差不多就能得到这个效果了。
作者: MeowSnow    时间: 2014-7-30 17:56
(っ´ω`c)不是直接开PS点斜切就好了吗……那张例图明显也是软件自动处理的。
作者: 克莉丝    时间: 2014-7-30 18:02
本帖最后由 克莉丝 于 2014-7-30 18:12 编辑

使用方法
精灵对象.bev(斜切角度,斜切起始边) #起始边可以省略,省略时默认为下边
精灵对象.apply_bitmap                      #把当前的位图作为源位图,如果不打算二次斜切可以不使用

原图
(, 下载次数: 71)

斜切30°
(, 下载次数: 81)

二次斜切30°
(, 下载次数: 68)

进行第二次斜切时如果之前未调用   精灵对象.apply_bitmap
那么会重新进行斜切而不是在上一次斜切的基础上进行斜切


@ban     @bitmap     拖出去tjjlb
[pre lang="ruby" line="1"]class Sprite
  alias bitmap_crysse bitmap=
  def bitmap=(b)
    (@ban= false;@resbitmap = b) if not @ban
    bitmap_crysse(b)
  end
  def apply_bitmap
    @resbitmap = self.bitmap
  end
  def bev(a,d = 2) # 1:上 2:下 3:左 4:右
    a = [[-90,a].max,90].min
    (return;self.bitmap.clear) if a.abs == 90
    k = Math.tan(a/57.3)
    c = @resbitmap.height
    w = @resbitmap.width
    if d<3
      nw = c * k + w
      @ban = true
      self.bitmap = Bitmap.new(nw,c)
      if  d == 1
        c.times{|y|
          self.bitmap.blt(y*k,y,@resbitmap,Rect.new(0,y,w,1))
        }
      else
        c.times{|y|
          self.bitmap.blt(y*k,c-y,@resbitmap,Rect.new(0,c-y,w,1))
        }
      end
    elsif d>2
      nh = w * k + c
      @ban = true
      self.bitmap = Bitmap.new(w,nh)
      if  d == 3
        w.times{|x|
          self.bitmap.blt(x,x*k,@resbitmap,Rect.new(x,0,1,c))
        }
      else
        w.times{|x|
          self.bitmap.blt(w-x,x*k,@resbitmap,Rect.new(w-x,0,1,c))
        }
      end
    end
  end
end

# 测试代码
s = Sprite.new                                     # 精灵
s.bitmap = Bitmap.new(32,32)                       # 创建位图
s.bitmap.fill_rect(0,0,32,32,Color.new(255,0,0))   # 填充矩形
a = 30                                             # 设置斜切角度
s.bev(a,4)                                         # 以设定的角度,右边为起始进行斜切
s.apply_bitmap                                     # 替换内部存储的位图以供二次切帖
s.bev(a,2)                                         # 以设定的角度,下边为起始进行斜切
loop{Graphics.update}                              # 返回结果[/pre]   




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X5.0