diff --git a/.classpath b/.classpath index a4763d1..a662f00 100644 --- a/.classpath +++ b/.classpath @@ -1,8 +1,8 @@ - - - - - - - - + + + + + + + + diff --git a/project.properties b/project.properties index 5a70945..8da376a 100644 --- a/project.properties +++ b/project.properties @@ -8,4 +8,4 @@ # project structure. # Project target. -target=android-7 +target=android-15 diff --git a/src/HaoRan/ImageFilter/Image.java b/src/HaoRan/ImageFilter/Image.java index fc59eff..e9bbdfa 100644 --- a/src/HaoRan/ImageFilter/Image.java +++ b/src/HaoRan/ImageFilter/Image.java @@ -19,271 +19,253 @@ package HaoRan.ImageFilter; import java.nio.IntBuffer; + import android.graphics.Bitmap; import android.graphics.Bitmap.Config; -import android.graphics.Matrix; /** * * @author daizhj - * + * */ public class Image { - - //original bitmap image - public Bitmap image; - public Bitmap destImage; - - //format of image (jpg/png) - private String formatName; - //dimensions of image - private int width, height; - // RGB Array Color - protected int[] colorArray; - - public Image(Bitmap img){ - this.image = img; - formatName = "jpg"; - width = img.getWidth(); - height = img.getHeight(); - destImage = Bitmap.createBitmap(width, height, Config.ARGB_8888); - updateColorArray(); - } - - public Image clone(){ - return new Image(this.image); - } - - /** - * Method to reset the image to a solid color - * @param color - color to rest the entire image to - */ - public void clearImage(int color){ - for(int y=0; y> 16) & 0xff; - g = (colorArray[index] >> 8) & 0xff; - b = colorArray[index] & 0xff; - colorArray[index] = 0xff000000 | (b << 16) | (g << 8) | r;//android系统与window系统的rgb存储方式相反 - } - } - } - - - /** - * Method to set the color of a specific pixel - * - * @param x - * @param y - * @param color - */ - public void setPixelColor(int x, int y, int color){ - colorArray[((y*image.getWidth()+x))] = color; - //image.setPixel(x, y, color); - //destImage.setPixel(x, y, colorArray[((y*image.getWidth()+x))]); - } - - /** - * Get the color for a specified pixel - * - * @param x - * @param y - * @return color - */ - public int getPixelColor(int x, int y){ - return colorArray[y*width+x]; - } - - /** - * Set the color of a specified pixel from an RGB combo - * - * @param x - * @param y - * @param c0 - * @param c1 - * @param c2 - */ - public void setPixelColor(int x, int y, int c0, int c1, int c2){ - int rgbcolor = (255 << 24) + (c0 << 16) + (c1 << 8) + c2; - colorArray[((y*image.getWidth()+x))] = rgbcolor; - //int array = ((y*image.getWidth()+x)); - - //vbb.order(ByteOrder.nativeOrder()); - //vertexBuffer = vbb.asFloatBuffer(); - //vertexBuffer.put(vertices); - //vertexBuffer.position(0); - - //image.setPixel(x, y, colorArray[((y*image.getWidth()+x))]); - } - - public void copyPixelsFromBuffer() { //从缓冲区中copy数据以加快像素处理速度 - IntBuffer vbb = IntBuffer.wrap(colorArray); - //vbb.put(colorArray); - destImage.copyPixelsFromBuffer(vbb); - vbb.clear(); - //vbb = null; - } - - /** - * Method to get the RED color for the specified - * pixel - * @param x - * @param y - * @return color of R - */ - public int getRComponent(int x, int y){ - return (getColorArray()[((y*width+x))]& 0x00FF0000) >>> 16; - } + // format of image (jpg/png) + private String formatName; + // dimensions of image + private int width, height; + // RGB Array Color + protected int[] colorArray; + + public Image(Bitmap img) { + formatName = "jpg"; + updateColorArray(img); + } - - /** - * Method to get the GREEN color for the specified - * pixel - * @param x - * @param y - * @return color of G - */ - public int getGComponent(int x, int y){ - return (getColorArray()[((y*width+x))]& 0x0000FF00) >>> 8; - } + public Image(int[] colorArray, int width, int height) { + this.colorArray = new int[colorArray.length]; + System.arraycopy(colorArray, 0, this.colorArray, 0, colorArray.length); + this.width = width; + this.height = height; + formatName = "jpg"; + } + public Image clone() { + return new Image(this.colorArray, this.width, this.height); + } - /** - * Method to get the BLUE color for the specified - * pixel - * @param x - * @param y - * @return color of B - */ - public int getBComponent(int x, int y){ - return (getColorArray()[((y*width+x))] & 0x000000FF); - } + /** + * Method to reset the image to a solid color + * + * @param color + * - color to rest the entire image to + */ + public void clearImage(int color) { + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + setPixelColor(x, y, color); + } + } + } - - - /** - * Method to rotate an image by the specified number of degrees - * - * @param rotateDegrees - */ - public void rotate (int rotateDegrees){ - Matrix mtx = new Matrix(); - mtx.postRotate(rotateDegrees); - image = Bitmap.createBitmap(image, 0, 0, width, height, mtx, true); - width = image.getWidth(); - height = image.getHeight(); - updateColorArray(); - } - + /** + * Set color array for image - called on initialisation by constructor + * + * @param bitmap + */ + private void updateColorArray(Bitmap image) { + width = image.getWidth(); + height = image.getHeight(); + colorArray = new int[width * height]; + image.getPixels(colorArray, 0, width, 0, 0, width, height); + int r, g, b; + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + int index = y * width + x; + r = (colorArray[index] >> 16) & 0xff; + g = (colorArray[index] >> 8) & 0xff; + b = colorArray[index] & 0xff; + colorArray[index] = 0xff000000 | (b << 16) | (g << 8) | r;// android系统与window系统的rgb存储方式相反 + } + } + image.recycle(); + } - /** - * @return the image - */ - public Bitmap getImage() { - //return image; - return destImage; - } + /** + * Method to set the color of a specific pixel + * + * @param x + * @param y + * @param color + */ + public void setPixelColor(int x, int y, int color) { + colorArray[((y * width + x))] = color; + // image.setPixel(x, y, color); + // destImage.setPixel(x, y, colorArray[((y*image.getWidth()+x))]); + } + /** + * Get the color for a specified pixel + * + * @param x + * @param y + * @return color + */ + public int getPixelColor(int x, int y) { + return colorArray[y * width + x]; + } - /** - * @param image the image to set - */ - public void setImage(Bitmap image) { - this.image = image; - } + /** + * Set the color of a specified pixel from an RGB combo + * + * @param x + * @param y + * @param c0 + * @param c1 + * @param c2 + */ + public void setPixelColor(int x, int y, int c0, int c1, int c2) { + int rgbcolor = (255 << 24) + (c0 << 16) + (c1 << 8) + c2; + colorArray[((y * width + x))] = rgbcolor; + // int array = ((y*image.getWidth()+x)); + // vbb.order(ByteOrder.nativeOrder()); + // vertexBuffer = vbb.asFloatBuffer(); + // vertexBuffer.put(vertices); + // vertexBuffer.position(0); - /** - * @return the formatName - */ - public String getFormatName() { - return formatName; - } + // image.setPixel(x, y, colorArray[((y*image.getWidth()+x))]); + } + private Bitmap copyPixelsFromBuffer() { // 从缓冲区中copy数据以加快像素处理速度 + IntBuffer vbb = IntBuffer.wrap(colorArray); + Bitmap destImage = Bitmap.createBitmap(width, height, Config.ARGB_8888); + destImage.copyPixelsFromBuffer(vbb); + vbb.clear(); + return destImage; + } - /** - * @param formatName the formatName to set - */ - public void setFormatName(String formatName) { - this.formatName = formatName; - } + /** + * Method to get the RED color for the specified pixel + * + * @param x + * @param y + * @return color of R + */ + public int getRComponent(int x, int y) { + return (getColorArray()[((y * width + x))] & 0x00FF0000) >>> 16; + } + /** + * Method to get the GREEN color for the specified pixel + * + * @param x + * @param y + * @return color of G + */ + public int getGComponent(int x, int y) { + return (getColorArray()[((y * width + x))] & 0x0000FF00) >>> 8; + } - /** - * @return the width - */ - public int getWidth() { - return width; - } + /** + * Method to get the BLUE color for the specified pixel + * + * @param x + * @param y + * @return color of B + */ + public int getBComponent(int x, int y) { + return (getColorArray()[((y * width + x))] & 0x000000FF); + } + /** + * Method to rotate an image by the specified number of degrees + * + * @param rotateDegrees + */ + // public void rotate (int rotateDegrees){ + // Matrix mtx = new Matrix(); + // mtx.postRotate(rotateDegrees); + // image = Bitmap.createBitmap(image, 0, 0, width, height, mtx, true); + // width = image.getWidth(); + // height = image.getHeight(); + // updateColorArray(); + // } - /** - * @param width the width to set - */ - public void setWidth(int width) { - this.width = width; - } + /** + * @return the image + */ + public Bitmap getImage() { + return copyPixelsFromBuffer(); + } + /** + * @return the formatName + */ + public String getFormatName() { + return formatName; + } - /** - * @return the height - */ - public int getHeight() { - return height; - } + /** + * @param formatName + * the formatName to set + */ + public void setFormatName(String formatName) { + this.formatName = formatName; + } + /** + * @return the width + */ + public int getWidth() { + return width; + } - /** - * @param height the height to set - */ - public void setHeight(int height) { - this.height = height; - } + /** + * @param width + * the width to set + */ + public void setWidth(int width) { + this.width = width; + } + /** + * @return the height + */ + public int getHeight() { + return height; + } - /** - * @return the colorArray - */ - public int[] getColorArray() { - return colorArray; - } + /** + * @param height + * the height to set + */ + public void setHeight(int height) { + this.height = height; + } + /** + * @return the colorArray + */ + public int[] getColorArray() { + return colorArray; + } - /** - * @param colorArray the colorArray to set - */ - public void setColorArray(int[] colorArray) { - this.colorArray = colorArray; - } + /** + * @param colorArray + * the colorArray to set + */ + public void setColorArray(int[] colorArray) { + this.colorArray = colorArray; + } - - public static int SAFECOLOR(int a) { - if (a < 0) - return 0; - else if (a > 255) - return 255; - else - return a; - } + public static int SAFECOLOR(int a) { + if (a < 0) + return 0; + else if (a > 255) + return 255; + else + return a; + } } diff --git a/src/HaoRan/ImageFilter/Main/ImageFilterMain.java b/src/HaoRan/ImageFilter/Main/ImageFilterMain.java index 0c977d5..8cb1649 100644 --- a/src/HaoRan/ImageFilter/Main/ImageFilterMain.java +++ b/src/HaoRan/ImageFilter/Main/ImageFilterMain.java @@ -1,246 +1,292 @@ -package HaoRan.ImageFilter.Main; - -import java.util.ArrayList; -import java.util.List; - -import HaoRan.ImageFilter.*; -import HaoRan.ImageFilter.RadialDistortionFilter.Point; -import HaoRan.ImageFilter.Distort.*; - -import android.app.Activity; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Color; -import android.opengl.Visibility; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Handler; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.BaseAdapter; -import android.widget.Gallery; -import android.widget.ImageView; -import android.widget.TextView; - -public class ImageFilterMain extends Activity { - - private ImageView imageView; - private TextView textView; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.main); - - imageView= (ImageView) findViewById(R.id.imgfilter); - textView = (TextView) findViewById(R.id.runtime); - //注:在android系统上,手机图片尺寸尽量控制在480*480范围内,否则在高斯运算时可以造成内存溢出的问题 - Bitmap bitmap = BitmapFactory.decodeResource(ImageFilterMain.this.getResources(), R.drawable.image); - imageView.setImageBitmap(bitmap); - - LoadImageFilter(); - } - - /** - * 加载图片filter - */ - private void LoadImageFilter() { - Gallery gallery = (Gallery) findViewById(R.id.galleryFilter); - final ImageFilterAdapter filterAdapter = new ImageFilterAdapter( - ImageFilterMain.this); - gallery.setAdapter(new ImageFilterAdapter(ImageFilterMain.this)); - gallery.setSelection(2); - gallery.setAnimationDuration(3000); - gallery.setOnItemClickListener(new AdapterView.OnItemClickListener() { - public void onItemClick(AdapterView arg0, View arg1, int position, long id) { - IImageFilter filter = (IImageFilter) filterAdapter.getItem(position); - new processImageTask(ImageFilterMain.this, filter).execute(); - } - }); - } - - public class processImageTask extends AsyncTask { - private IImageFilter filter; - private Activity activity = null; - public processImageTask(Activity activity, IImageFilter imageFilter) { - this.filter = imageFilter; - this.activity = activity; - } - - @Override - protected void onPreExecute() { - // TODO Auto-generated method stub - super.onPreExecute(); - textView.setVisibility(View.VISIBLE); - } - - public Bitmap doInBackground(Void... params) { - Image img = null; - try - { - Bitmap bitmap = BitmapFactory.decodeResource(activity.getResources(), R.drawable.image); - img = new Image(bitmap); - if (filter != null) { - img = filter.process(img); - img.copyPixelsFromBuffer(); - } - return img.getImage(); - } - catch(Exception e){ - if (img != null && img.destImage.isRecycled()) { - img.destImage.recycle(); - img.destImage = null; - System.gc(); // 提醒系统及时回收 - } - } - finally{ - if (img != null && img.image.isRecycled()) { - img.image.recycle(); - img.image = null; - System.gc(); // 提醒系统及时回收 - } - } - return null; - } - - @Override - protected void onPostExecute(Bitmap result) { - if(result != null){ - super.onPostExecute(result); - imageView.setImageBitmap(result); - } - textView.setVisibility(View.GONE); - } - } - - public class ImageFilterAdapter extends BaseAdapter { - private class FilterInfo { - public int filterID; - public IImageFilter filter; - - public FilterInfo(int filterID, IImageFilter filter) { - this.filterID = filterID; - this.filter = filter; - } - } - - private Context mContext; - private List filterArray = new ArrayList(); - - public ImageFilterAdapter(Context c) { - mContext = c; - //加载滤镜列表 - - //v0.3 目前 共提供73种效果 - filterArray.add(new FilterInfo(R.drawable.zoomblur_filter, new ZoomBlurFilter(30))); - filterArray.add(new FilterInfo(R.drawable.threedgrid_filter, new ThreeDGridFilter(16, 100))); - filterArray.add(new FilterInfo(R.drawable.colortone_filter, new ColorToneFilter(Color.rgb(33, 168, 254), 192))); - filterArray.add(new FilterInfo(R.drawable.colortone_filter2, new ColorToneFilter(0x00FF00, 192)));//green - filterArray.add(new FilterInfo(R.drawable.colortone_filter3, new ColorToneFilter(0xFF0000, 192)));//blue - filterArray.add(new FilterInfo(R.drawable.colortone_filter4, new ColorToneFilter(0x00FFFF, 192)));//yellow - filterArray.add(new FilterInfo(R.drawable.softglow_filter, new SoftGlowFilter(10, 0.1f, 0.1f))); - filterArray.add(new FilterInfo(R.drawable.tilereflection_filter, new TileReflectionFilter(20, 8))); - filterArray.add(new FilterInfo(R.drawable.blind_filter1, new BlindFilter(true, 96, 100, 0xffffff))); - filterArray.add(new FilterInfo(R.drawable.blind_filter2, new BlindFilter(false, 96, 100, 0x000000))); - filterArray.add(new FilterInfo(R.drawable.raiseframe_filter, new RaiseFrameFilter(20))); - filterArray.add(new FilterInfo(R.drawable.shift_filter, new ShiftFilter(10))); - filterArray.add(new FilterInfo(R.drawable.wave_filter, new WaveFilter(25, 10))); - filterArray.add(new FilterInfo(R.drawable.bulge_filter, new BulgeFilter(-97))); - filterArray.add(new FilterInfo(R.drawable.twist_filter, new TwistFilter(27, 106))); - filterArray.add(new FilterInfo(R.drawable.ripple_filter, new RippleFilter(38, 15, true))); - filterArray.add(new FilterInfo(R.drawable.illusion_filter, new IllusionFilter(3))); - filterArray.add(new FilterInfo(R.drawable.supernova_filter, new SupernovaFilter(0x00FFFF,20,100))); - filterArray.add(new FilterInfo(R.drawable.lensflare_filter, new LensFlareFilter())); - filterArray.add(new FilterInfo(R.drawable.posterize_filter, new PosterizeFilter(2))); - filterArray.add(new FilterInfo(R.drawable.gamma_filter, new GammaFilter(50))); - filterArray.add(new FilterInfo(R.drawable.sharp_filter, new SharpFilter())); - - //v0.2 - filterArray.add(new FilterInfo(R.drawable.invert_filter, new ComicFilter())); - filterArray.add(new FilterInfo(R.drawable.invert_filter, new SceneFilter(5f, Gradient.Scene())));//green - filterArray.add(new FilterInfo(R.drawable.invert_filter, new SceneFilter(5f, Gradient.Scene1())));//purple - filterArray.add(new FilterInfo(R.drawable.invert_filter, new SceneFilter(5f, Gradient.Scene2())));//blue - filterArray.add(new FilterInfo(R.drawable.invert_filter, new SceneFilter(5f, Gradient.Scene3()))); - filterArray.add(new FilterInfo(R.drawable.invert_filter, new FilmFilter(80f))); - filterArray.add(new FilterInfo(R.drawable.invert_filter, new FocusFilter())); - filterArray.add(new FilterInfo(R.drawable.invert_filter, new CleanGlassFilter())); - filterArray.add(new FilterInfo(R.drawable.invert_filter, new PaintBorderFilter(0x00FF00)));//green - filterArray.add(new FilterInfo(R.drawable.invert_filter, new PaintBorderFilter(0x00FFFF)));//yellow - filterArray.add(new FilterInfo(R.drawable.invert_filter, new PaintBorderFilter(0xFF0000)));//blue - filterArray.add(new FilterInfo(R.drawable.invert_filter, new LomoFilter())); - - //v0.1 - filterArray.add(new FilterInfo(R.drawable.invert_filter, new InvertFilter())); - filterArray.add(new FilterInfo(R.drawable.blackwhite_filter, new BlackWhiteFilter())); - filterArray.add(new FilterInfo(R.drawable.edge_filter, new EdgeFilter())); - filterArray.add(new FilterInfo(R.drawable.pixelate_filter, new PixelateFilter())); - filterArray.add(new FilterInfo(R.drawable.neon_filter, new NeonFilter())); - filterArray.add(new FilterInfo(R.drawable.bigbrother_filter, new BigBrotherFilter())); - filterArray.add(new FilterInfo(R.drawable.monitor_filter, new MonitorFilter())); - filterArray.add(new FilterInfo(R.drawable.relief_filter, new ReliefFilter())); - filterArray.add(new FilterInfo(R.drawable.brightcontrast_filter,new BrightContrastFilter())); - filterArray.add(new FilterInfo(R.drawable.saturationmodity_filter, new SaturationModifyFilter())); - filterArray.add(new FilterInfo(R.drawable.threshold_filter, new ThresholdFilter())); - filterArray.add(new FilterInfo(R.drawable.noisefilter, new NoiseFilter())); - filterArray.add(new FilterInfo(R.drawable.banner_filter1, new BannerFilter(10, true))); - filterArray.add(new FilterInfo(R.drawable.banner_filter2, new BannerFilter(10, false))); - filterArray.add(new FilterInfo(R.drawable.rectmatrix_filter, new RectMatrixFilter())); - filterArray.add(new FilterInfo(R.drawable.blockprint_filter, new BlockPrintFilter())); - filterArray.add(new FilterInfo(R.drawable.brick_filter, new BrickFilter())); - filterArray.add(new FilterInfo(R.drawable.gaussianblur_filter, new GaussianBlurFilter())); - filterArray.add(new FilterInfo(R.drawable.light_filter, new LightFilter())); - filterArray.add(new FilterInfo(R.drawable.mosaic_filter,new MistFilter())); - filterArray.add(new FilterInfo(R.drawable.mosaic_filter,new MosaicFilter())); - filterArray.add(new FilterInfo(R.drawable.oilpaint_filter, new OilPaintFilter())); - filterArray.add(new FilterInfo(R.drawable.radialdistortion_filter,new RadialDistortionFilter())); - filterArray.add(new FilterInfo(R.drawable.reflection1_filter,new ReflectionFilter(true))); - filterArray.add(new FilterInfo(R.drawable.reflection2_filter,new ReflectionFilter(false))); - filterArray.add(new FilterInfo(R.drawable.saturationmodify_filter, new SaturationModifyFilter())); - filterArray.add(new FilterInfo(R.drawable.smashcolor_filter,new SmashColorFilter())); - filterArray.add(new FilterInfo(R.drawable.tint_filter, new TintFilter())); - filterArray.add(new FilterInfo(R.drawable.vignette_filter, new VignetteFilter())); - filterArray.add(new FilterInfo(R.drawable.autoadjust_filter,new AutoAdjustFilter())); - filterArray.add(new FilterInfo(R.drawable.colorquantize_filter, new ColorQuantizeFilter())); - filterArray.add(new FilterInfo(R.drawable.waterwave_filter, new WaterWaveFilter())); - filterArray.add(new FilterInfo(R.drawable.vintage_filter,new VintageFilter())); - filterArray.add(new FilterInfo(R.drawable.oldphoto_filter,new OldPhotoFilter())); - filterArray.add(new FilterInfo(R.drawable.sepia_filter, new SepiaFilter())); - filterArray.add(new FilterInfo(R.drawable.rainbow_filter,new RainBowFilter())); - filterArray.add(new FilterInfo(R.drawable.feather_filter,new FeatherFilter())); - filterArray.add(new FilterInfo(R.drawable.xradiation_filter,new XRadiationFilter())); - filterArray.add(new FilterInfo(R.drawable.nightvision_filter,new NightVisionFilter())); - - filterArray.add(new FilterInfo(R.drawable.saturationmodity_filter,null/* 此处会生成原图效果 */)); - } - - public int getCount() { - return filterArray.size(); - } - - public Object getItem(int position) { - return position < filterArray.size() ? filterArray.get(position).filter - : null; - } - - public long getItemId(int position) { - return position; - } - - public View getView(int position, View convertView, ViewGroup parent) { - Bitmap bmImg = BitmapFactory - .decodeResource(mContext.getResources(), - filterArray.get(position).filterID); - int width = 100;// bmImg.getWidth(); - int height = 100;// bmImg.getHeight(); - bmImg.recycle(); - ImageView imageview = new ImageView(mContext); - imageview.setImageResource(filterArray.get(position).filterID); - imageview.setLayoutParams(new Gallery.LayoutParams(width, height)); - imageview.setScaleType(ImageView.ScaleType.FIT_CENTER);// 设置显示比例类型 - return imageview; - } - }; - -} +package HaoRan.ImageFilter.Main; + +import java.util.ArrayList; +import java.util.List; + +import HaoRan.ImageFilter.AutoAdjustFilter; +import HaoRan.ImageFilter.BannerFilter; +import HaoRan.ImageFilter.BigBrotherFilter; +import HaoRan.ImageFilter.BlackWhiteFilter; +import HaoRan.ImageFilter.BlindFilter; +import HaoRan.ImageFilter.BlockPrintFilter; +import HaoRan.ImageFilter.BrickFilter; +import HaoRan.ImageFilter.BrightContrastFilter; +import HaoRan.ImageFilter.CleanGlassFilter; +import HaoRan.ImageFilter.ColorQuantizeFilter; +import HaoRan.ImageFilter.ColorToneFilter; +import HaoRan.ImageFilter.ComicFilter; +import HaoRan.ImageFilter.EdgeFilter; +import HaoRan.ImageFilter.FeatherFilter; +import HaoRan.ImageFilter.FilmFilter; +import HaoRan.ImageFilter.FocusFilter; +import HaoRan.ImageFilter.GammaFilter; +import HaoRan.ImageFilter.GaussianBlurFilter; +import HaoRan.ImageFilter.Gradient; +import HaoRan.ImageFilter.IImageFilter; +import HaoRan.ImageFilter.IllusionFilter; +import HaoRan.ImageFilter.Image; +import HaoRan.ImageFilter.InvertFilter; +import HaoRan.ImageFilter.LensFlareFilter; +import HaoRan.ImageFilter.LightFilter; +import HaoRan.ImageFilter.LomoFilter; +import HaoRan.ImageFilter.MistFilter; +import HaoRan.ImageFilter.MonitorFilter; +import HaoRan.ImageFilter.MosaicFilter; +import HaoRan.ImageFilter.NeonFilter; +import HaoRan.ImageFilter.NightVisionFilter; +import HaoRan.ImageFilter.NoiseFilter; +import HaoRan.ImageFilter.OilPaintFilter; +import HaoRan.ImageFilter.OldPhotoFilter; +import HaoRan.ImageFilter.PaintBorderFilter; +import HaoRan.ImageFilter.PixelateFilter; +import HaoRan.ImageFilter.PosterizeFilter; +import HaoRan.ImageFilter.R; +import HaoRan.ImageFilter.RadialDistortionFilter; +import HaoRan.ImageFilter.RainBowFilter; +import HaoRan.ImageFilter.RaiseFrameFilter; +import HaoRan.ImageFilter.RectMatrixFilter; +import HaoRan.ImageFilter.ReflectionFilter; +import HaoRan.ImageFilter.ReliefFilter; +import HaoRan.ImageFilter.SaturationModifyFilter; +import HaoRan.ImageFilter.SceneFilter; +import HaoRan.ImageFilter.SepiaFilter; +import HaoRan.ImageFilter.SharpFilter; +import HaoRan.ImageFilter.ShiftFilter; +import HaoRan.ImageFilter.SmashColorFilter; +import HaoRan.ImageFilter.SoftGlowFilter; +import HaoRan.ImageFilter.SupernovaFilter; +import HaoRan.ImageFilter.ThreeDGridFilter; +import HaoRan.ImageFilter.ThresholdFilter; +import HaoRan.ImageFilter.TileReflectionFilter; +import HaoRan.ImageFilter.TintFilter; +import HaoRan.ImageFilter.VignetteFilter; +import HaoRan.ImageFilter.VintageFilter; +import HaoRan.ImageFilter.WaterWaveFilter; +import HaoRan.ImageFilter.XRadiationFilter; +import HaoRan.ImageFilter.ZoomBlurFilter; +import HaoRan.ImageFilter.Distort.BulgeFilter; +import HaoRan.ImageFilter.Distort.RippleFilter; +import HaoRan.ImageFilter.Distort.TwistFilter; +import HaoRan.ImageFilter.Distort.WaveFilter; +import android.app.Activity; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.os.AsyncTask; +import android.os.Bundle; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.Gallery; +import android.widget.ImageView; +import android.widget.TextView; + +public class ImageFilterMain extends Activity { + + private ImageView imageView; + private TextView textView; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + + imageView= (ImageView) findViewById(R.id.imgfilter); + textView = (TextView) findViewById(R.id.runtime); + //注:在android系统上,手机图片尺寸尽量控制在480*480范围内,否则在高斯运算时可以造成内存溢出的问题 + Bitmap bitmap = BitmapFactory.decodeResource(ImageFilterMain.this.getResources(), R.drawable.image); + imageView.setImageBitmap(bitmap); + + LoadImageFilter(); + } + + /** + * 加载图片filter + */ + private void LoadImageFilter() { + Gallery gallery = (Gallery) findViewById(R.id.galleryFilter); + final ImageFilterAdapter filterAdapter = new ImageFilterAdapter( + ImageFilterMain.this); + gallery.setAdapter(new ImageFilterAdapter(ImageFilterMain.this)); + gallery.setSelection(2); + gallery.setAnimationDuration(3000); + gallery.setOnItemClickListener(new AdapterView.OnItemClickListener() { + public void onItemClick(AdapterView arg0, View arg1, int position, long id) { + IImageFilter filter = (IImageFilter) filterAdapter.getItem(position); + new processImageTask(ImageFilterMain.this, filter).execute(); + } + }); + } + + public class processImageTask extends AsyncTask { + private IImageFilter filter; + private Activity activity = null; + public processImageTask(Activity activity, IImageFilter imageFilter) { + this.filter = imageFilter; + this.activity = activity; + } + + @Override + protected void onPreExecute() { + // TODO Auto-generated method stub + super.onPreExecute(); + textView.setVisibility(View.VISIBLE); + } + + public Bitmap doInBackground(Void... params) { + Image img = null; + try + { + Bitmap bitmap = BitmapFactory.decodeResource(activity.getResources(), R.drawable.image); + img = new Image(bitmap); + if (filter != null) { + img = filter.process(img); + } + return img.getImage(); + } + catch(Exception e){ + } + return null; + } + + @Override + protected void onPostExecute(Bitmap result) { + if(result != null){ + super.onPostExecute(result); + imageView.setImageBitmap(result); + } + textView.setVisibility(View.GONE); + } + } + + public class ImageFilterAdapter extends BaseAdapter { + private class FilterInfo { + public int filterID; + public IImageFilter filter; + + public FilterInfo(int filterID, IImageFilter filter) { + this.filterID = filterID; + this.filter = filter; + } + } + + private Context mContext; + private List filterArray = new ArrayList(); + + public ImageFilterAdapter(Context c) { + mContext = c; + //加载滤镜列表 + + //v0.3 目前 共提供73种效果 + filterArray.add(new FilterInfo(R.drawable.zoomblur_filter, new ZoomBlurFilter(30))); + filterArray.add(new FilterInfo(R.drawable.threedgrid_filter, new ThreeDGridFilter(16, 100))); + filterArray.add(new FilterInfo(R.drawable.colortone_filter, new ColorToneFilter(Color.rgb(33, 168, 254), 192))); + filterArray.add(new FilterInfo(R.drawable.colortone_filter2, new ColorToneFilter(0x00FF00, 192)));//green + filterArray.add(new FilterInfo(R.drawable.colortone_filter3, new ColorToneFilter(0xFF0000, 192)));//blue + filterArray.add(new FilterInfo(R.drawable.colortone_filter4, new ColorToneFilter(0x00FFFF, 192)));//yellow + filterArray.add(new FilterInfo(R.drawable.softglow_filter, new SoftGlowFilter(10, 0.1f, 0.1f))); + filterArray.add(new FilterInfo(R.drawable.tilereflection_filter, new TileReflectionFilter(20, 8))); + filterArray.add(new FilterInfo(R.drawable.blind_filter1, new BlindFilter(true, 96, 100, 0xffffff))); + filterArray.add(new FilterInfo(R.drawable.blind_filter2, new BlindFilter(false, 96, 100, 0x000000))); + filterArray.add(new FilterInfo(R.drawable.raiseframe_filter, new RaiseFrameFilter(20))); + filterArray.add(new FilterInfo(R.drawable.shift_filter, new ShiftFilter(10))); + filterArray.add(new FilterInfo(R.drawable.wave_filter, new WaveFilter(25, 10))); + filterArray.add(new FilterInfo(R.drawable.bulge_filter, new BulgeFilter(-97))); + filterArray.add(new FilterInfo(R.drawable.twist_filter, new TwistFilter(27, 106))); + filterArray.add(new FilterInfo(R.drawable.ripple_filter, new RippleFilter(38, 15, true))); + filterArray.add(new FilterInfo(R.drawable.illusion_filter, new IllusionFilter(3))); + filterArray.add(new FilterInfo(R.drawable.supernova_filter, new SupernovaFilter(0x00FFFF,20,100))); + filterArray.add(new FilterInfo(R.drawable.lensflare_filter, new LensFlareFilter())); + filterArray.add(new FilterInfo(R.drawable.posterize_filter, new PosterizeFilter(2))); + filterArray.add(new FilterInfo(R.drawable.gamma_filter, new GammaFilter(50))); + filterArray.add(new FilterInfo(R.drawable.sharp_filter, new SharpFilter())); + + //v0.2 + filterArray.add(new FilterInfo(R.drawable.invert_filter, new ComicFilter())); + filterArray.add(new FilterInfo(R.drawable.invert_filter, new SceneFilter(5f, Gradient.Scene())));//green + filterArray.add(new FilterInfo(R.drawable.invert_filter, new SceneFilter(5f, Gradient.Scene1())));//purple + filterArray.add(new FilterInfo(R.drawable.invert_filter, new SceneFilter(5f, Gradient.Scene2())));//blue + filterArray.add(new FilterInfo(R.drawable.invert_filter, new SceneFilter(5f, Gradient.Scene3()))); + filterArray.add(new FilterInfo(R.drawable.invert_filter, new FilmFilter(80f))); + filterArray.add(new FilterInfo(R.drawable.invert_filter, new FocusFilter())); + filterArray.add(new FilterInfo(R.drawable.invert_filter, new CleanGlassFilter())); + filterArray.add(new FilterInfo(R.drawable.invert_filter, new PaintBorderFilter(0x00FF00)));//green + filterArray.add(new FilterInfo(R.drawable.invert_filter, new PaintBorderFilter(0x00FFFF)));//yellow + filterArray.add(new FilterInfo(R.drawable.invert_filter, new PaintBorderFilter(0xFF0000)));//blue + filterArray.add(new FilterInfo(R.drawable.invert_filter, new LomoFilter())); + + //v0.1 + filterArray.add(new FilterInfo(R.drawable.invert_filter, new InvertFilter())); + filterArray.add(new FilterInfo(R.drawable.blackwhite_filter, new BlackWhiteFilter())); + filterArray.add(new FilterInfo(R.drawable.edge_filter, new EdgeFilter())); + filterArray.add(new FilterInfo(R.drawable.pixelate_filter, new PixelateFilter())); + filterArray.add(new FilterInfo(R.drawable.neon_filter, new NeonFilter())); + filterArray.add(new FilterInfo(R.drawable.bigbrother_filter, new BigBrotherFilter())); + filterArray.add(new FilterInfo(R.drawable.monitor_filter, new MonitorFilter())); + filterArray.add(new FilterInfo(R.drawable.relief_filter, new ReliefFilter())); + filterArray.add(new FilterInfo(R.drawable.brightcontrast_filter,new BrightContrastFilter())); + filterArray.add(new FilterInfo(R.drawable.saturationmodity_filter, new SaturationModifyFilter())); + filterArray.add(new FilterInfo(R.drawable.threshold_filter, new ThresholdFilter())); + filterArray.add(new FilterInfo(R.drawable.noisefilter, new NoiseFilter())); + filterArray.add(new FilterInfo(R.drawable.banner_filter1, new BannerFilter(10, true))); + filterArray.add(new FilterInfo(R.drawable.banner_filter2, new BannerFilter(10, false))); + filterArray.add(new FilterInfo(R.drawable.rectmatrix_filter, new RectMatrixFilter())); + filterArray.add(new FilterInfo(R.drawable.blockprint_filter, new BlockPrintFilter())); + filterArray.add(new FilterInfo(R.drawable.brick_filter, new BrickFilter())); + filterArray.add(new FilterInfo(R.drawable.gaussianblur_filter, new GaussianBlurFilter())); + filterArray.add(new FilterInfo(R.drawable.light_filter, new LightFilter())); + filterArray.add(new FilterInfo(R.drawable.mosaic_filter,new MistFilter())); + filterArray.add(new FilterInfo(R.drawable.mosaic_filter,new MosaicFilter())); + filterArray.add(new FilterInfo(R.drawable.oilpaint_filter, new OilPaintFilter())); + filterArray.add(new FilterInfo(R.drawable.radialdistortion_filter,new RadialDistortionFilter())); + filterArray.add(new FilterInfo(R.drawable.reflection1_filter,new ReflectionFilter(true))); + filterArray.add(new FilterInfo(R.drawable.reflection2_filter,new ReflectionFilter(false))); + filterArray.add(new FilterInfo(R.drawable.saturationmodify_filter, new SaturationModifyFilter())); + filterArray.add(new FilterInfo(R.drawable.smashcolor_filter,new SmashColorFilter())); + filterArray.add(new FilterInfo(R.drawable.tint_filter, new TintFilter())); + filterArray.add(new FilterInfo(R.drawable.vignette_filter, new VignetteFilter())); + filterArray.add(new FilterInfo(R.drawable.autoadjust_filter,new AutoAdjustFilter())); + filterArray.add(new FilterInfo(R.drawable.colorquantize_filter, new ColorQuantizeFilter())); + filterArray.add(new FilterInfo(R.drawable.waterwave_filter, new WaterWaveFilter())); + filterArray.add(new FilterInfo(R.drawable.vintage_filter,new VintageFilter())); + filterArray.add(new FilterInfo(R.drawable.oldphoto_filter,new OldPhotoFilter())); + filterArray.add(new FilterInfo(R.drawable.sepia_filter, new SepiaFilter())); + filterArray.add(new FilterInfo(R.drawable.rainbow_filter,new RainBowFilter())); + filterArray.add(new FilterInfo(R.drawable.feather_filter,new FeatherFilter())); + filterArray.add(new FilterInfo(R.drawable.xradiation_filter,new XRadiationFilter())); + filterArray.add(new FilterInfo(R.drawable.nightvision_filter,new NightVisionFilter())); + + filterArray.add(new FilterInfo(R.drawable.saturationmodity_filter,null/* 此处会生成原图效果 */)); + } + + public int getCount() { + return filterArray.size(); + } + + public Object getItem(int position) { + return position < filterArray.size() ? filterArray.get(position).filter + : null; + } + + public long getItemId(int position) { + return position; + } + + public View getView(int position, View convertView, ViewGroup parent) { + Bitmap bmImg = BitmapFactory + .decodeResource(mContext.getResources(), + filterArray.get(position).filterID); + int width = 100;// bmImg.getWidth(); + int height = 100;// bmImg.getHeight(); + bmImg.recycle(); + ImageView imageview = new ImageView(mContext); + imageview.setImageResource(filterArray.get(position).filterID); + imageview.setLayoutParams(new Gallery.LayoutParams(width, height)); + imageview.setScaleType(ImageView.ScaleType.FIT_CENTER);// 设置显示比例类型 + return imageview; + } + }; + +}