Here is an approach without StringReplace. It is one function f that first destructures the file-name and has two more definitions: one for files with an even number and one for all others.
ClearAll[f] f[str_String] := f[{str, DirectoryName[str], FileBaseName[str], FileExtension[str]}]; f[{str_, dir_, name_, ext_} /; ToExpression[name, InputForm, EvenQ]] := With[{ num = IntegerString[FromDigits[name] + 2, 10, StringLength[name]] }, FileNameJoin[{dir, num <> "." <> ext}]]; f[{str_, __}] := str
Now better test it properly since my last version was completely screwed up. I need to make Linux filenames from your strings since otherwise, Mathematica's file functions don't work here. On your Windows machine, this should not be necessary.
string = {"E:\\job\\a\\000251.png", "E:\\job\\a\\000252.png", "E:\\job\\a\\000253.png", "E:\\job\\a\\000254.png", "E:\\job\\a\\000255.png", "E:\\job\\a\\000256.png"}; string = StringReplace[string, {"E:\\" :> "/", "\\" :> "/"}] f/@string//Column (* /job/a/000251.png /job/a/000254.png /job/a/000253.png /job/a/000256.png /job/a/000255.png /job/a/000258.png *)