Это зависит от того, для чего вы его используете, конечно. Даже Java-версия zxing имеет некоторые важные ограничения и проблемы с производительностью. Например, он может найти только один штрих-код на странице. Кроме того, алгоритмы, которые он использует для поиска 1-D штрих-кода на странице, не особенно эффективны (не знаю об алгоритмах для двумерных штрих-кодов), которые не были частью требований к проекту, над которым я работал). Это все, что можно решить - я начал совершенствоваться несколько месяцев назад и смог значительно улучшить производительность и надежность местоположения в 1-D месте, но наши приоритеты dev были сдвинуты, поэтому я не работал над этим с тех пор.
Что касается того, является ли частичный порт C# хорошим, если вы хотите отправить сообщение обратно с какими различиями, я буду рад прокомментировать.
EDIT - вот некоторые из рефакторинга, что я сделал:
Во-первых, вынесем RowNumberStrategy следующим образом:
public interface RowNumberStrategy {
public int getNextRowNumber();
public class OriginalRowStrategy implements RowNumberStrategy{
int middle;
boolean tryHarder = false;
int rowStep;
int maxLines;
int maxRows;
int x;
public OriginalRowStrategy(int maxRows, boolean tryHarder) {
this.x = 0;
this.maxRows = maxRows;
this.middle = maxRows >> 1; // divide by 2
this.tryHarder = tryHarder;
rowStep = Math.max(1, maxRows >> (tryHarder ? 7 : 4));
if (tryHarder) {
maxLines = maxRows; // Look at the whole image, not just the center
} else {
maxLines = 9; // Nine rows spaced 1/16 apart is roughly the middle half of the image
}
}
public int getNextRowNumber() {
if (x > maxLines)
return -1;
int rowStepsAboveOrBelow = (x + 1) >> 1;
boolean isAbove = (x & 0x01) == 0; // i.e. is x even?
int rowNumber = middle + rowStep * (isAbove ? rowStepsAboveOrBelow : -rowStepsAboveOrBelow);
if (rowNumber < 0 || rowNumber >= maxRows) {
// Oops, if we run off the top or bottom, stop
return -1;
}
x = x + 1;
return rowNumber;
}
}
public class LinearScanRowStrategy implements RowNumberStrategy{
private final int maxRows;
private int currentRow;
public LinearScanRowStrategy(int totalRows) {
maxRows = totalRows;
currentRow = 0;
}
public int getNextRowNumber() {
if (currentRow > maxRows)
return -1;
return maxRows - 1 - currentRow++;
}
}
public class ProgressiveScanRowStrategy implements RowNumberStrategy{
private final int maxRows;
private int currentStepSize;
private int currentStep;
public ProgressiveScanRowStrategy(int totalRows) {
maxRows = totalRows;
currentStep = 0;
currentStepSize = maxRows;
}
public int getNextRowNumber() {
int nextRow = (currentStep++) * currentStepSize;
if (nextRow < maxRows)
return nextRow;
currentStepSize = currentStepSize >> 1;
if (currentStepSize <= 0)
return -1;
currentStep = 1;
nextRow = currentStep * currentStepSize;
return nextRow;
}
}
}
тогда верхняя часть doDecode будет выглядеть следующим образом:
private Result doDecode(MonochromeBitmapSource image, Hashtable hints) throws ReaderException {
int width = image.getWidth();
int height = image.getHeight();
BitArray row = new BitArray(width);
boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER);
RowNumberStrategy rowProvider = new RowNumberStrategy.ProgressiveScanRowStrategy(height);
int rowNumber;
while ((rowNumber = rowProvider.getNextRowNumber()) != -1){
...
}
В конечном итоге это должно быть то, что может быть установлено через DecodeHintType, но мы обнаружили, что прогрессивная стратегия быстрее старой стратегии в каждом случае, (и не только немного быстрее - много быстрее).
Почему бы вам просто не узнать, попробовать? –
@ Ed О, эм, ду! Ха-ха, ты знаешь, мне кажется, мне нужно закрыть мой вопрос. Oopsey. –
Ну, сам вопрос будет полезен для людей в будущем, поэтому я не думаю, что это правильно, чтобы закрыть его. Кроме того, некоторые люди могут иметь представление, которое требует времени, чтобы узнать, что вы можете пропустить на первый взгляд. Я просто предлагал, чтобы, в то же время, попробовать это было бы моей первой целью. –