3042 label: 'Reduce Number of Colors by Masking Bits...' |
3042 label: 'Reduce Number of Colors by Masking Bits...' |
3043 itemValue: reduceNumberOfColors |
3043 itemValue: reduceNumberOfColors |
3044 translateLabel: true |
3044 translateLabel: true |
3045 ) |
3045 ) |
3046 (MenuItem |
3046 (MenuItem |
3047 label: 'Dither to Depth...' |
|
3048 itemValue: ditherToDepth |
|
3049 translateLabel: true |
|
3050 ) |
|
3051 (MenuItem |
|
3052 label: '-' |
3047 label: '-' |
3053 ) |
3048 ) |
3054 (MenuItem |
3049 (MenuItem |
3055 enabled: imageIsLoadedHolder |
3050 enabled: imageIsLoadedHolder |
3056 label: 'Brighten' |
3051 label: 'Brighten' |
3085 label: 'Make GrayScale' |
3080 label: 'Make GrayScale' |
3086 itemValue: makeGrayScaleImage |
3081 itemValue: makeGrayScaleImage |
3087 translateLabel: true |
3082 translateLabel: true |
3088 ) |
3083 ) |
3089 (MenuItem |
3084 (MenuItem |
|
3085 label: 'Make Monochrome' |
|
3086 itemValue: makeMonochromeImage |
|
3087 translateLabel: true |
|
3088 ) |
|
3089 (MenuItem |
|
3090 label: 'Make Inverse' |
|
3091 itemValue: makeInverse |
|
3092 translateLabel: true |
|
3093 ) |
|
3094 (MenuItem |
|
3095 label: '-' |
|
3096 ) |
|
3097 (MenuItem |
3090 enabled: allowedToChangeImageDimensionAndDepth |
3098 enabled: allowedToChangeImageDimensionAndDepth |
3091 label: 'Make dithered 8Bit Palette' |
3099 label: 'Make dithered 8Bit Palette' |
3092 itemValue: makeDitheredPaletteImage |
3100 itemValue: makeDitheredPaletteImage |
3093 translateLabel: true |
3101 translateLabel: true |
3094 isVisible: false |
3102 isVisible: false |
3095 ) |
3103 ) |
3096 (MenuItem |
3104 (MenuItem |
3097 label: 'Make Inverse' |
3105 label: 'Dither to Depth...' |
3098 itemValue: makeInverse |
3106 itemValue: ditherToDepth |
|
3107 translateLabel: true |
|
3108 ) |
|
3109 (MenuItem |
|
3110 label: 'Threshold to Depth...' |
|
3111 itemValue: thresholdToDepth |
3099 translateLabel: true |
3112 translateLabel: true |
3100 ) |
3113 ) |
3101 (MenuItem |
3114 (MenuItem |
3102 label: '-' |
3115 label: '-' |
3103 ) |
3116 ) |
7833 |
7846 |
7834 rotationString := Dialog |
7847 rotationString := Dialog |
7835 request:(resources string:'Rotate by (degrees, clockwise):') |
7848 request:(resources string:'Rotate by (degrees, clockwise):') |
7836 list:#( '-90' '90' '180' '45' '-45' '135' '-135' ) |
7849 list:#( '-90' '90' '180' '45' '-45' '135' '-135' ) |
7837 initialAnswer:90. |
7850 initialAnswer:90. |
7838 rotationString isEmptyOrNil ifTrue:[^ self]. "/ cancelled |
7851 rotationString isEmptyOrNil ifTrue:[^ self]. "/ canceled |
7839 rotation := Number readFrom:rotationString onError:[nil]. |
7852 rotation := Number readFrom:rotationString onError:[nil]. |
7840 rotation isNil ifTrue:[^ self]. |
7853 rotation isNil ifTrue:[^ self]. |
7841 |
7854 |
7842 "/ box := EnterBox new. |
7855 "/ box := EnterBox new. |
7843 "/ box title:(resources string:'Rotate by (degrees, clockwise):'). |
7856 "/ box title:(resources string:'Rotate by (degrees, clockwise):'). |
7933 doUndo |
7947 doUndo |
7934 "reverses last edit action" |
7948 "reverses last edit action" |
7935 |
7949 |
7936 imageEditView undo. |
7950 imageEditView undo. |
7937 self updateImagePreView |
7951 self updateImagePreView |
|
7952 ! |
|
7953 |
|
7954 makeMonochromeImage |
|
7955 "let user choose a threshold, then convert to monochrome" |
|
7956 |
|
7957 |image userInput thresholdBrighness| |
|
7958 |
|
7959 image := imageEditView image. |
|
7960 |
|
7961 Dialog modifyingBoxWith:[:box | |
|
7962 |preview slider update thresholdValue| |
|
7963 |
|
7964 thresholdValue := 0.5 asValue. |
|
7965 |
|
7966 box enterField converter:(PrintConverter new initForNumber). |
|
7967 box enterField model:thresholdValue. |
|
7968 box verticalPanel extent:1.0 @ 300. |
|
7969 |
|
7970 box verticalPanel add:(slider := HorizontalSlider new start:0 stop:1 step:0.05). |
|
7971 slider model:thresholdValue. |
|
7972 slider width:1.0; leftInset:4; rightInset:4. |
|
7973 |
|
7974 box verticalPanel add:(preview := ImageView new). |
|
7975 preview extent:1.0 @300. |
|
7976 preview level:-1. |
|
7977 box verticalPanel horizontalLayout:#fitSpace. |
|
7978 |
|
7979 update := |
|
7980 [ |
|
7981 |s t| |
|
7982 |
|
7983 t := thresholdValue value clampBetween:0 and:1. |
|
7984 preview image:((image asThresholdMonochromeImage:t) |
|
7985 magnifiedPreservingRatioTo:preview extent). |
|
7986 ]. |
|
7987 update value. |
|
7988 box enterField acceptOnLostFocus:true. |
|
7989 box enterField acceptOnLeave:true. |
|
7990 thresholdValue onChangeEvaluate:update. |
|
7991 "/ box height:400. |
|
7992 ] do:[ |
|
7993 userInput := Dialog request:'Treshold (0=black; 1=white) ?' initialAnswer:0.5. |
|
7994 ]. |
|
7995 userInput isEmptyOrNil ifTrue:[^ self]. |
|
7996 thresholdBrighness := Number readFrom:userInput onError:nil. |
|
7997 thresholdBrighness isNil ifTrue:[^ self]. |
|
7998 |
|
7999 thresholdBrighness := thresholdBrighness clampBetween:0 and:1. |
|
8000 imageEditView newImageWithUndo:(image asThresholdMonochromeImage:thresholdBrighness) |
|
8001 |
|
8002 "Created: / 24-08-2017 / 15:26:44 / cg" |
|
8003 "Modified (comment): / 24-08-2017 / 16:43:32 / cg" |
7938 ! ! |
8004 ! ! |
7939 |
8005 |
7940 !ImageEditor methodsFor:'user actions-image sequences'! |
8006 !ImageEditor methodsFor:'user actions-image sequences'! |
7941 |
8007 |
7942 editEachImageFromSequence |
8008 editEachImageFromSequence |