在JES / Jython中抖动

时间:2013-10-31 16:57:24

标签: python jython dithering jes

我的目标是使用Floyd-Steinberg方法在JES / Jython中抖动图像。以下是我到目前为止的情况:

def Dither_RGB (Canvas):
    for Y in range(getHeight(Canvas)):
        for X in range(getWidth(Canvas)):
            P     = getColor(Canvas,X,Y)
            E     = getColor(Canvas,X+1,Y)
            SW    = getColor(Canvas,X-1,Y+1)
            S     = getColor(Canvas,X,Y+1)
            SE    = getColor(Canvas,X+1,Y+1)
        return

上述代码的目标是扫描图像的像素并处理Floyd-Steinberg所需的相邻像素。

我无法理解的是如何计算和分配旧像素和新像素之间的R,G,B差异。

任何能够指引我朝着正确方向发展的事情都将非常感激。

1 个答案:

答案 0 :(得分:1)

我对你要实现的方法一无所知,但对于其他方法:假设Canvas的类型为Picture,则不能直接获得那种颜色。可以从类型Pixel

的变量中获取像素的颜色

示例:以下是从图像中获取每个像素的颜色并将其分配到新图片中完全相同位置的步骤:

def copy(old_picture):
  # Create a picture to be returned, of the exact same size than the source one
  new_picture = makeEmptyPicture(old_picture.getWidth(), old_picture.getHeight())

  # Process copy pixel by pixel
  for x in xrange(old_picture.getWidth()):
    for y in xrange(old_picture.getHeight()):
      # Get the source pixel at (x,y)
      old_pixel = getPixel(old_picture, x, y)
      # Get the pixel at (x,y) from the resulting new picture
      # which remains blank until you assign it a color
      new_pixel = getPixel(new_picture, x, y)
      # Grab the color of the previously selected source pixel
      # and assign it to the resulting new picture
      setColor(new_pixel, getColor(old_pixel))

  return new_picture

file = pickAFile()
old_pic = makePicture(file)
new_pic = copy(old_pic)

注意: 上述示例仅适用于您想要处理新图片而不修改旧图片的情况。如果您的算法需要在执行算法时动态修改旧图片,则最终的setColor将直接应用于原始像素(不需要新图片,也不需要return语句)

从这里开始,您可以通过操纵像素的RGB值来计算您想要的任何内容(使用应用于setRed()的{​​{1}},setGreen()setBlue()函数,或 Pixel 并使用col = makeColor(red_val, green_val, blue_val)将返回的颜色应用于像素。


RGB操作示例here

其他人here,尤其是here