skip to Main Content

Hi I made some filter effects using Photoshop curves and they look like this:
enter image description here

enter image description here

Is there a way I can extract each one of the 256 numbers from each color so it is a number array like this?

var r = [0, 0, 0, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42, 44, 45, 47, 48, 49, 52, 54, 55, 57, 59, 60, 62, 65, 67, 69, 70, 72, 74, 77, 79, 81, 83, 86, 88, 90, 92, 94, 97, 99, 101, 103, 107, 109, 111, 112, 116, 118, 120, 124, 126, 127, 129, 133, 135, 136, 140, 142, 143, 145, 149, 150, 152, 155, 157, 159, 162, 163, 165, 167, 170, 171, 173, 176, 177, 178, 180, 183, 184, 185, 188, 189, 190, 192, 194, 195, 196, 198, 200, 201, 202, 203, 204, 206, 207, 208, 209, 211, 212, 213, 214, 215, 216, 218, 219, 219, 220, 221, 222, 223, 224, 225, 226, 227, 227, 228, 229, 229, 230, 231, 232, 232, 233, 234, 234, 235, 236, 236, 237, 238, 238, 239, 239, 240, 241, 241, 242, 242, 243, 244, 244, 245, 245, 245, 246, 247, 247, 248, 248, 249, 249, 249, 250, 251, 251, 252, 252, 252, 253, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]

Sorry for the question if it’s stupid, i’m not even sure what i’m asking, it’s late.

UPDATE: following Mark Setchell‘s answer, i was able to create a saved.ppm file with these values inside it.

enter image description here

The last step was to extract the RGB values from this long string of numbers, Red is the 0th, 3nd, 6th number, Green is the 1st, 4th, 7th number etc.

For anyone else’s interest, I was trying to create a filter on Photoshop curves, then extract its RGB values and apply it using pixel cross processing on HTML Canvas, similar to a demo shown here.

2

Answers


  1. I don’t feel like writing the code today, least of all when you are not too sure what you are up to! However, what you are asking is perfectly achievable.

    If you save the curve you have created (the Save option is in the top right menu), you will get a .ACV file. The format of this file is given here if you scroll down to the section entitled Curves. It is a pretty simple format with just an identifier and a version number then a count of the number of points that you have defined for your curve, i.e. 6 in your case. Then, for each point, the 4 coordinates. These can be pretty easily extracted with Perl or similar.

    You could then fit a curve to those points, probably using GNUplot, and interpolate to find the points you are looking for.

    Excerpt from referenced document:

    enter image description here

    Here is an extract from some code I wrote in Perl that actually writes a .ACV file. I know you will actually want to read one, bit you’ll get the idea of the byte packing technique…

    #!/usr/bin/perl
    use strict;
    use warnings;
    use Image::Magick;
    use Data::Dumper;
    
    my $Debug=1;    # 1=print debug messages, 0=don't
    my $NPOINTS=5;  # Number of points in curve we create
    
    ....
    .... other stuff
    ....
    
    # Work out name of the curve file = image basename + acv
    my $curvefile=substr($imagename,0,rindex($imagename,'.')) . ".acv";
    open(my $out,'>:raw',$curvefile) or die "Unable to open: $!";
    print $out pack("s>",4); # Version=4
    print $out pack("s>",4); # Number of curves in file = Master NULL curve + R + G + B
    
    print $out pack("s>",2);                        # Master NULL curve with 2 points for all channels
    print $out pack("s>",0  ),pack("s>",0  );       # 0 out, 0 in
    print $out pack("s>",255),pack("s>",255);       # 255 out, 255 in
    
    print $out pack("s>",2+$NPOINTS);               # Red curve
    print $out pack("s>",0  ),pack("s>",0  );       # 0 out, 0 in
    for($p=0;$p<$NPOINTS;$p++){
       print $out pack("s>",$Rpoint[$p]),pack("s>",$greypoint[$p]);
    }
    print $out pack("s>",255),pack("s>",255);       # 255 out, 255 in
    
    print $out pack("s>",2+$NPOINTS);               # Green curve
    print $out pack("s>",0  ),pack("s>",0  );       # 0 out, 0 in
    for($p=0;$p<$NPOINTS;$p++){
       print $out pack("s>",$Gpoint[$p]),pack("s>",$greypoint[$p]);
    }
    print $out pack("s>",255),pack("s>",255);       # 255 out, 255 in
    
    print $out pack("s>",2+$NPOINTS);               # Blue curve
    print $out pack("s>",0  ),pack("s>",0  );        # 0 out, 0 in
    for($p=0;$p<$NPOINTS;$p++){
       print $out pack("s>",$Bpoint[$p]),pack("s>",$greypoint[$p]);
    }
    print $out pack("s>",255),pack("s>",255);        # 255 out, 255 in
    
    close($out);
    
    Login or Signup to reply.
  2. Here is a totally different, and simpler way of doing it. Save the data below in a file called ramp.ppm – it is a Portable Pixmap format from the NetPBM suite see Wikipedia here. It is a black-to-white greyscale ramp 256 pixels wide and 1 pixel tall.

    Load that into Photoshop and apply your curve to it then save as a PNG file.

    P3
    256 1
    255
    0 0 0
    1 1 1
    2 2 2
    3 3 3
    4 4 4
    5 5 5
    6 6 6
    7 7 7
    8 8 8
    9 9 9
    10 10 10
    11 11 11
    12 12 12
    13 13 13
    14 14 14
    15 15 15
    16 16 16
    17 17 17
    18 18 18
    19 19 19
    20 20 20
    21 21 21
    22 22 22
    23 23 23
    24 24 24
    25 25 25
    26 26 26
    27 27 27
    28 28 28
    29 29 29
    30 30 30
    31 31 31
    32 32 32
    33 33 33
    34 34 34
    35 35 35
    36 36 36
    37 37 37
    38 38 38
    39 39 39
    40 40 40
    41 41 41
    42 42 42
    43 43 43
    44 44 44
    45 45 45
    46 46 46
    47 47 47
    48 48 48
    49 49 49
    50 50 50
    51 51 51
    52 52 52
    53 53 53
    54 54 54
    55 55 55
    56 56 56
    57 57 57
    58 58 58
    59 59 59
    60 60 60
    61 61 61
    62 62 62
    63 63 63
    64 64 64
    65 65 65
    66 66 66
    67 67 67
    68 68 68
    69 69 69
    70 70 70
    71 71 71
    72 72 72
    73 73 73
    74 74 74
    75 75 75
    76 76 76
    77 77 77
    78 78 78
    79 79 79
    80 80 80
    81 81 81
    82 82 82
    83 83 83
    84 84 84
    85 85 85
    86 86 86
    87 87 87
    88 88 88
    89 89 89
    90 90 90
    91 91 91
    92 92 92
    93 93 93
    94 94 94
    95 95 95
    96 96 96
    97 97 97
    98 98 98
    99 99 99
    100 100 100
    101 101 101
    102 102 102
    103 103 103
    104 104 104
    105 105 105
    106 106 106
    107 107 107
    108 108 108
    109 109 109
    110 110 110
    111 111 111
    112 112 112
    113 113 113
    114 114 114
    115 115 115
    116 116 116
    117 117 117
    118 118 118
    119 119 119
    120 120 120
    121 121 121
    122 122 122
    123 123 123
    124 124 124
    125 125 125
    126 126 126
    127 127 127
    128 128 128
    129 129 129
    130 130 130
    131 131 131
    132 132 132
    133 133 133
    134 134 134
    135 135 135
    136 136 136
    137 137 137
    138 138 138
    139 139 139
    140 140 140
    141 141 141
    142 142 142
    143 143 143
    144 144 144
    145 145 145
    146 146 146
    147 147 147
    148 148 148
    149 149 149
    150 150 150
    151 151 151
    152 152 152
    153 153 153
    154 154 154
    155 155 155
    156 156 156
    157 157 157
    158 158 158
    159 159 159
    160 160 160
    161 161 161
    162 162 162
    163 163 163
    164 164 164
    165 165 165
    166 166 166
    167 167 167
    168 168 168
    169 169 169
    170 170 170
    171 171 171
    172 172 172
    173 173 173
    174 174 174
    175 175 175
    176 176 176
    177 177 177
    178 178 178
    179 179 179
    180 180 180
    181 181 181
    182 182 182
    183 183 183
    184 184 184
    185 185 185
    186 186 186
    187 187 187
    188 188 188
    189 189 189
    190 190 190
    191 191 191
    192 192 192
    193 193 193
    194 194 194
    195 195 195
    196 196 196
    197 197 197
    198 198 198
    199 199 199
    200 200 200
    201 201 201
    202 202 202
    203 203 203
    204 204 204
    205 205 205
    206 206 206
    207 207 207
    208 208 208
    209 209 209
    210 210 210
    211 211 211
    212 212 212
    213 213 213
    214 214 214
    215 215 215
    216 216 216
    217 217 217
    218 218 218
    219 219 219
    220 220 220
    221 221 221
    222 222 222
    223 223 223
    224 224 224
    225 225 225
    226 226 226
    227 227 227
    228 228 228
    229 229 229
    230 230 230
    231 231 231
    232 232 232
    233 233 233
    234 234 234
    235 235 235
    236 236 236
    237 237 237
    238 238 238
    239 239 239
    240 240 240
    241 241 241
    242 242 242
    243 243 243
    244 244 244
    245 245 245
    246 246 246
    247 247 247
    248 248 248
    249 249 249
    250 250 250
    251 251 251
    252 252 252
    253 253 253
    254 254 254
    255 255 255
    

    If you have Linux, and you have ImageMagick, you can then convert the saved PNG file back into a PPM file with

    convert saved.png -compress none saved.ppm
    

    The file saved.ppm will then show you the output of your curve for each input value in the greyscale ramp – in effect it will be the 256 values you are looking for.

    If you don’t have ImageMagick, just give me the PNG file and I’ll convert it for you.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search