Я только что написал нужные методы декодирования / кодирования; матрица выглядит иначе, потому что я создал входной QR-код с помощью приложения QR Droid и выходной QR-код с помощью ZXing , который может использовать другой уровень исправления ошибок; тем не менее оба имеют один и тот же целевой URL, который является моим.
Зависимости происходят из репозиториев google()
и mavenCentral()
:
dependencies {
implementation "androidx.appcompat:appcompat:1.0.2"
// https://mvnrepository.com/artifact/com.google.zxing
implementation "com.google.zxing:core:3.3.3"
implementation "com.google.zxing:android-core:3.3.0"
}
Используемый ресурс макета:
И манипуляции с BitMatrix
; где метод encode()
должен быть достаточным при наличии String
в наличии; просто добавил оба метода ради полного примера (он читает Bitmap
из одного AppCompatImageView
, а затем записывает в другой AppCompatImageView
):
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.Log;
import androidx.annotation.ColorInt;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatImageView;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
public class MainActivity extends AppCompatActivity {
private AppCompatImageView mInputImage;
private AppCompatImageView mOutputImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.layout_main);
this.mInputImage = this.findViewById(R.id.inputImage);
this.mOutputImage = this.findViewById(R.id.outputImage);
Bitmap bitmap = ((BitmapDrawable) this.mInputImage.getDrawable()).getBitmap();
String data = this.decode(bitmap);
bitmap = this.encode(data, bitmap.getWidth(), bitmap.getHeight(), 0xFFFFD034,0xFF06425C);
this.mOutputImage.setImageBitmap(bitmap);
}
private String decode(Bitmap bitmap) {
String data = null;
MultiFormatReader reader = new MultiFormatReader();
int[] intArray = new int[bitmap.getWidth() * bitmap.getHeight()];
bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
LuminanceSource source = new RGBLuminanceSource(bitmap.getWidth(), bitmap.getHeight(), intArray);
BinaryBitmap binary = new BinaryBitmap(new HybridBinarizer(source));
try {
Result result = reader.decode(binary);
data = result.getText();
} catch (NotFoundException e) {
e.printStackTrace();
}
Log.d("ZXing", "decoded: " + data);
return data;
}
private Bitmap encode(String contents, int width, int height, @ColorInt int foreground, @ColorInt int background) {
MultiFormatWriter writer = new MultiFormatWriter();
BitMatrix matrix = null;
Bitmap bitmap = null;
try {
matrix = writer.encode(contents, BarcodeFormat.QR_CODE, width, height);
} catch (WriterException e) {
e.printStackTrace();
}
if(matrix != null) {
int[] pixels = new int[width * height];
for (int y = 0; y < height; y++) {
int offset = y * width;
for (int x = 0; x < width; x++) {
pixels[offset + x] = matrix.get(x, y) ? foreground : background;
}
}
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
}
return bitmap;
}
}
Результат выглядит примерно так; где левая является входной матрицей, а правая является выходной матрицей:
Я только что нашел: "Как мне?" видео .
Хорошие блоги о C # /. Net:
Многие хорошие ресурсы уже перечислены.
Если вы ищете статьи, Code Code - хороший сайт для частых посещений.
Я предлагаю вам попробовать и прочитать блог ScottGu как можно чаще, чтобы быть в курсе последних событий в мире .Net
Good pocasts:
dotnetrocks.com
dnrtv.com
www.hanselminutes.com
And some blogs:
weblogs.asp.net/scottgu
www.lhotka.net/weblog
haacked.com
Вот некоторые из них, которые могут помочь вам начать:
Следующее не относится к сетевым ресурсам, но кое-что вы можете рассмотреть:
Не бойтесь посетить CodePlex и найти приложение, которое, возможно, вас интересует, и загрузить исходный код.
Запустите приложение в режиме отладки, чтобы понять, как оно работает. Вы также можете сделать поиск в Google для проектов с открытым исходным кодом на C #, чтобы еще больше улучшить свое обучение.
Удачи в обучении
Если вы заинтересованы в производительности, посетите блог Маони, чтобы узнать, как работает GC
DotNetKicks - это хорошая совокупность различных сообщений в блогах, связанных с .NET, и других новостей. Он не предназначен специально для новых пользователей, но определенно много полезного контента на многие темы. Это также довольно своевременно, поэтому я считаю, что это хороший ресурс для того, чтобы оставаться в курсе последних технологий и дискуссий в мире .NET.
Существует бесплатная документация по C #, только для основ:
Galileo Openbook - Visual C # 2008
Для меня это в основном google.com для запуска с: -)
Я бы сказал, что плохих больше, чем хороших.
: (
Лично я обычно придерживаюсь MSDN и читаю официальные блоги / сообщения от групп разработчиков.
Только расширенный (или необычный) материал для ASP.Net, C # и SQL Server http://blog.DigitalTools.com