Feature Requests item #2803280, was opened at 2009-06-08 20:40
Message generated for change (Tracker Item Submitted) made by eyerwolf
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=536848&aid=2803280&group_id=73133

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: Interface Improvements (example)
Group: Next Release (example)
Status: Open
Priority: 5
Private: No
Submitted By: Daniel Mundra (eyerwolf)
Assigned to: Nobody/Anonymous (nobody)
Summary: Image processing using wxHaskell

Initial Comment:
I liked wxHaskell, its quite useful for a lot of stuff. I wanted to use the 
getPixelArray to read in an image and then run a function on pixels to affect 
it and create a new image. The below examples blurs the image.

{-----------------------------------------------------------------------------------------
Author: Daniel M

Description: Uses wxhaskell a gui widget program written in haskell. This 
program
takes in an image and calls a function on its pixels and then creates a new 
image.
We get the pixels in the form of an array

wxHaskell: http://haskell.org/haskellwiki/WxHaskell
-----------------------------------------------------------------------------------------}
module Main where

import Graphics.UI.WX
import Graphics.UI.WXCore
import System
import Array
import Text.Regex.Posix

-- Needs 'start' to run the gui and handles for images
main :: IO ()
main = do
        args <- getArgs
        let fname = head args
        start $ imageViewer fname

-- Loads a image and transforms the pixels using changeImg
-- Creates a new image chg_test.jpg with the changed pixels    
imageViewer fname
   = do
        f <- frame [text := "Working!"]
        let img = image fname
        arr <- loadImageArr img
        w <- imageGetWidth img
        h <- imageGetHeight img
        let newArr = changeImgArr arr w h
        newImg <- imageCreateFromPixelArray newArr
        imageSaveFile newImg ("chg_" ++ fname) 1
        let msg = "Done!"
        print msg
        close f
        
-- Returns a Array of pixels as (Point,Color)   
loadImageArr img
      = do
         arr <- imageGetPixelArray img
         return arr
         
-- Takes a array of pixels and width, height of an image
-- and a creates a new array where pixel color has been affected
-- to blur the image. The code will ignore all the edge pixels.
changeImgArr arr w h = array b ([( point x y, arr!(point x y) ) | x <- 
[0..w-1], y <- [0..h-1], x==0 || y==0] ++ 
                                [( point x y, recChgImg arr x y ) | x <- 
[1..w-2], y <- [1..h-2]] ++
                                [( point x y, arr!(point x y) ) | x <- 
[0..w-1], y <- [0..h-1], x==(w-1) || y==(h-1)])
        where 
        b = bounds arr

-- Gets the color of current pixel and its neighbors (up,down,left,right)
-- Algorithm:
--      newX = (Xi,j + Xi-1,j + Xi+1,j + Xi,j-1 + Xi,j+1) / 5
recChgImg arr x y = newCol
        where
        col =           arr!(point x y)
        colUp =         arr!(point (x-1) y)
        colDown =       arr!(point (x+1) y)
        colLeft =       arr!(point x (y-1))
        colRight =      arr!(point x (y+1))
        newColR = (colorRed col + colorRed colUp + colorRed colDown + colorRed 
colLeft + colorRed colRight) `div` 5
        newColG = (colorGreen col + colorGreen colUp + colorGreen colDown + 
colorGreen colLeft + colorGreen colRight) `div` 5
        newColB = (colorBlue col + colorBlue colUp + colorBlue colDown + 
colorBlue colLeft + colorBlue colRight) `div` 5
        newCol = rgb newColR newColG newColB
        

The above program works but it is quite slow for big images. You can see I have 
to call colorRed, colorBlue, ... for each pixel to get the color value. I think 
that's where it is really slow because it is calling that function so many 
times. I wonder maybe for the next version whether having a Color constructor 
would be useful to pattern match on. I am new to haskell and wxHaskell was the 
few libraries that actually can give me pixel values.

Thanks
Daniel

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=536848&aid=2803280&group_id=73133

------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensing option that enables unlimited
royalty-free distribution of the report engine for externally facing 
server and web deployment.
http://p.sf.net/sfu/businessobjects
_______________________________________________
wxhaskell-devel mailing list
wxhaskell-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wxhaskell-devel

Reply via email to