@@ -1,152 +0,0 @@ | |||
/* | |||
* Copyright 2012 ZXing.Net authors | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
using System; | |||
#if !PORTABLE | |||
#if !(SILVERLIGHT || NETFX_CORE) | |||
#if !UNITY | |||
using System.Drawing; | |||
using ZXing.QrCode; | |||
#else | |||
using UnityEngine; | |||
#endif | |||
#elif NETFX_CORE | |||
using Windows.UI.Xaml.Media.Imaging; | |||
#else | |||
using System.Windows.Media.Imaging; | |||
#endif | |||
#endif | |||
#if MONOANDROID | |||
using Android.Graphics; | |||
#endif | |||
namespace ZXing | |||
{ | |||
/// <summary> | |||
/// A smart class to decode the barcode inside a bitmap object | |||
/// </summary> | |||
#if MONOTOUCH | |||
public class BarcodeReader : BarcodeReaderGeneric<MonoTouch.UIKit.UIImage>, IBarcodeReader, IMultipleBarcodeReader | |||
{ | |||
private static readonly Func<MonoTouch.UIKit.UIImage, LuminanceSource> defaultCreateLuminanceSource = | |||
(img) => new RGBLuminanceSource(img); | |||
#else | |||
#if !PORTABLE | |||
#if !(SILVERLIGHT || NETFX_CORE) | |||
#if !UNITY | |||
public class BarcodeReader : BarcodeReaderGeneric<Bitmap>, IBarcodeReader | |||
{ | |||
private static readonly Func<Bitmap, LuminanceSource> defaultCreateLuminanceSource = | |||
(bitmap) => new BitmapLuminanceSource(bitmap); | |||
#else | |||
public class BarcodeReader : BarcodeReaderGeneric<Color32[]>, IBarcodeReader, IMultipleBarcodeReader | |||
{ | |||
private static readonly Func<Color32[], int, int, LuminanceSource> defaultCreateLuminanceSource = | |||
(rawColor32, width, height) => new Color32LuminanceSource(rawColor32, width, height); | |||
#endif | |||
#else | |||
public class BarcodeReader : BarcodeReaderGeneric<WriteableBitmap>, IBarcodeReader, IMultipleBarcodeReader | |||
{ | |||
private static readonly Func<WriteableBitmap, LuminanceSource> defaultCreateLuminanceSource = | |||
(bitmap) => new BitmapLuminanceSource(bitmap); | |||
#endif | |||
#else | |||
public class BarcodeReader : BarcodeReaderGeneric<byte[]>, IBarcodeReader, IMultipleBarcodeReader | |||
{ | |||
private static readonly Func<byte[], LuminanceSource> defaultCreateLuminanceSource = | |||
(data) => null; | |||
#endif | |||
#endif | |||
/// <summary> | |||
/// Initializes a new instance of the <see cref="BarcodeReader"/> class. | |||
/// </summary> | |||
public BarcodeReader() | |||
: this(new QRCodeReader(), defaultCreateLuminanceSource, null) | |||
{ | |||
} | |||
/// <summary> | |||
/// Initializes a new instance of the <see cref="BarcodeReader"/> class. | |||
/// </summary> | |||
/// <param name="reader">Sets the reader which should be used to find and decode the barcode. | |||
/// If null then MultiFormatReader is used</param> | |||
/// <param name="createLuminanceSource">Sets the function to create a luminance source object for a bitmap. | |||
/// If null, an exception is thrown when Decode is called</param> | |||
/// <param name="createBinarizer">Sets the function to create a binarizer object for a luminance source. | |||
/// If null then HybridBinarizer is used</param> | |||
public BarcodeReader(Reader reader, | |||
#if MONOTOUCH | |||
Func<MonoTouch.UIKit.UIImage, LuminanceSource> createLuminanceSource, | |||
#elif MONOANDROID | |||
Func<Android.Graphics.Bitmap, LuminanceSource> createLuminanceSource, | |||
#else | |||
#if !(SILVERLIGHT || NETFX_CORE) | |||
#if !UNITY | |||
#if !PORTABLE | |||
Func<Bitmap, LuminanceSource> createLuminanceSource, | |||
#else | |||
Func<byte[], LuminanceSource> createLuminanceSource, | |||
#endif | |||
#else | |||
Func<Color32[], int, int, LuminanceSource> createLuminanceSource, | |||
#endif | |||
#else | |||
Func<WriteableBitmap, LuminanceSource> createLuminanceSource, | |||
#endif | |||
#endif | |||
Func<LuminanceSource, Binarizer> createBinarizer | |||
) | |||
: base(reader, createLuminanceSource ?? defaultCreateLuminanceSource, createBinarizer) | |||
{ | |||
} | |||
/// <summary> | |||
/// Initializes a new instance of the <see cref="BarcodeReader"/> class. | |||
/// </summary> | |||
/// <param name="reader">Sets the reader which should be used to find and decode the barcode. | |||
/// If null then MultiFormatReader is used</param> | |||
/// <param name="createLuminanceSource">Sets the function to create a luminance source object for a bitmap. | |||
/// If null, an exception is thrown when Decode is called</param> | |||
/// <param name="createBinarizer">Sets the function to create a binarizer object for a luminance source. | |||
/// If null then HybridBinarizer is used</param> | |||
public BarcodeReader(Reader reader, | |||
#if MONOTOUCH | |||
Func<MonoTouch.UIKit.UIImage, LuminanceSource> createLuminanceSource, | |||
#elif MONOANDROID | |||
Func<Android.Graphics.Bitmap, LuminanceSource> createLuminanceSource, | |||
#else | |||
#if !(SILVERLIGHT || NETFX_CORE) | |||
#if !UNITY | |||
#if !PORTABLE | |||
Func<Bitmap, LuminanceSource> createLuminanceSource, | |||
#else | |||
Func<byte[], LuminanceSource> createLuminanceSource, | |||
#endif | |||
#else | |||
Func<Color32[], int, int, LuminanceSource> createLuminanceSource, | |||
#endif | |||
#else | |||
Func<WriteableBitmap, LuminanceSource> createLuminanceSource, | |||
#endif | |||
#endif | |||
Func<LuminanceSource, Binarizer> createBinarizer, | |||
Func<byte[], int, int, RGBLuminanceSource.BitmapFormat, LuminanceSource> createRGBLuminanceSource | |||
) | |||
: base(reader, createLuminanceSource ?? defaultCreateLuminanceSource, createBinarizer, createRGBLuminanceSource) | |||
{ | |||
} | |||
} | |||
} |
@@ -1,436 +0,0 @@ | |||
/* | |||
* Copyright 2012 ZXing.Net authors | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
using System; | |||
using System.Collections.Generic; | |||
using ZXing.Common; | |||
using ZXing.QrCode; | |||
namespace ZXing | |||
{ | |||
/// <summary> | |||
/// A smart class to decode the barcode inside a bitmap object | |||
/// </summary> | |||
public class BarcodeReaderGeneric<T> : IBarcodeReaderGeneric<T> | |||
{ | |||
private static readonly Func<LuminanceSource, Binarizer> defaultCreateBinarizer = | |||
(luminanceSource) => new HybridBinarizer(luminanceSource); | |||
protected static readonly Func<byte[], int, int, RGBLuminanceSource.BitmapFormat, LuminanceSource> defaultCreateRGBLuminanceSource = | |||
(rawBytes, width, height, format) => new RGBLuminanceSource(rawBytes, width, height, format); | |||
private Reader reader; | |||
private readonly Func<byte[], int, int, RGBLuminanceSource.BitmapFormat, LuminanceSource> createRGBLuminanceSource; | |||
#if !UNITY | |||
private readonly Func<T, LuminanceSource> createLuminanceSource; | |||
#else | |||
private readonly Func<T, int, int, LuminanceSource> createLuminanceSource; | |||
#endif | |||
private readonly Func<LuminanceSource, Binarizer> createBinarizer; | |||
private bool usePreviousState; | |||
private DecodingOptions options; | |||
/// <summary> | |||
/// Gets or sets the options. | |||
/// </summary> | |||
/// <value> | |||
/// The options. | |||
/// </value> | |||
public DecodingOptions Options | |||
{ | |||
get { return options ?? (options = new DecodingOptions()); } | |||
set { options = value; } | |||
} | |||
/// <summary> | |||
/// Gets the reader which should be used to find and decode the barcode. | |||
/// </summary> | |||
/// <value> | |||
/// The reader. | |||
/// </value> | |||
protected Reader Reader | |||
{ | |||
get | |||
{ | |||
return reader ?? (reader = new QRCodeReader()); | |||
} | |||
} | |||
/// <summary> | |||
/// Gets or sets a method which is called if an important point is found | |||
/// </summary> | |||
/// <value> | |||
/// The result point callback. | |||
/// </value> | |||
public event Action<ResultPoint> ResultPointFound | |||
{ | |||
add | |||
{ | |||
if (!Options.Hints.ContainsKey(DecodeHintType.NEED_RESULT_POINT_CALLBACK)) | |||
{ | |||
var callback = new ResultPointCallback(OnResultPointFound); | |||
Options.Hints[DecodeHintType.NEED_RESULT_POINT_CALLBACK] = callback; | |||
} | |||
explicitResultPointFound += value; | |||
usePreviousState = false; | |||
} | |||
remove | |||
{ | |||
explicitResultPointFound -= value; | |||
if (explicitResultPointFound == null) | |||
Options.Hints.Remove(DecodeHintType.NEED_RESULT_POINT_CALLBACK); | |||
usePreviousState = false; | |||
} | |||
} | |||
private event Action<ResultPoint> explicitResultPointFound; | |||
/// <summary> | |||
/// event is executed if a result was found via decode | |||
/// </summary> | |||
public event Action<Result> ResultFound; | |||
/// <summary> | |||
/// Gets or sets a flag which cause a deeper look into the bitmap | |||
/// </summary> | |||
/// <value> | |||
/// <c>true</c> if [try harder]; otherwise, <c>false</c>. | |||
/// </value> | |||
[Obsolete("Please use the Options.TryHarder property instead.")] | |||
public bool TryHarder | |||
{ | |||
get { return Options.TryHarder; } | |||
set { Options.TryHarder = value; } | |||
} | |||
/// <summary> | |||
/// Image is a pure monochrome image of a barcode. | |||
/// </summary> | |||
/// <value> | |||
/// <c>true</c> if monochrome image of a barcode; otherwise, <c>false</c>. | |||
/// </value> | |||
[Obsolete("Please use the Options.PureBarcode property instead.")] | |||
public bool PureBarcode | |||
{ | |||
get { return Options.PureBarcode; } | |||
set { Options.PureBarcode = value; } | |||
} | |||
/// <summary> | |||
/// Specifies what character encoding to use when decoding, where applicable (type String) | |||
/// </summary> | |||
/// <value> | |||
/// The character set. | |||
/// </value> | |||
[Obsolete("Please use the Options.CharacterSet property instead.")] | |||
public string CharacterSet | |||
{ | |||
get { return Options.CharacterSet; } | |||
set { Options.CharacterSet = value; } | |||
} | |||
/// <summary> | |||
/// Image is known to be of one of a few possible formats. | |||
/// Maps to a {@link java.util.List} of {@link BarcodeFormat}s. | |||
/// </summary> | |||
/// <value> | |||
/// The possible formats. | |||
/// </value> | |||
[Obsolete("Please use the Options.PossibleFormats property instead.")] | |||
public IList<BarcodeFormat> PossibleFormats | |||
{ | |||
get { return Options.PossibleFormats; } | |||
set { Options.PossibleFormats = value; } | |||
} | |||
/// <summary> | |||
/// Gets or sets a value indicating whether the image should be automatically rotated. | |||
/// Rotation is supported for 90, 180 and 270 degrees | |||
/// </summary> | |||
/// <value> | |||
/// <c>true</c> if image should be rotated; otherwise, <c>false</c>. | |||
/// </value> | |||
public bool AutoRotate { get; set; } | |||
/// <summary> | |||
/// Gets or sets a value indicating whether the image should be automatically inverted | |||
/// if no result is found in the original image. | |||
/// ATTENTION: Please be carefully because it slows down the decoding process if it is used | |||
/// </summary> | |||
/// <value> | |||
/// <c>true</c> if image should be inverted; otherwise, <c>false</c>. | |||
/// </value> | |||
public bool TryInverted { get; set; } | |||
#if !UNITY | |||
/// <summary> | |||
/// Optional: Gets or sets the function to create a luminance source object for a bitmap. | |||
/// If null a platform specific default LuminanceSource is used | |||
/// </summary> | |||
/// <value> | |||
/// The function to create a luminance source object. | |||
/// </value> | |||
protected Func<T, LuminanceSource> CreateLuminanceSource | |||
#else | |||
/// <summary> | |||
/// Optional: Gets or sets the function to create a luminance source object for a bitmap. | |||
/// If null a platform specific default LuminanceSource is used | |||
/// </summary> | |||
/// <value> | |||
/// The function to create a luminance source object. | |||
/// </value> | |||
protected Func<T, int, int, LuminanceSource> CreateLuminanceSource | |||
#endif | |||
{ | |||
get | |||
{ | |||
return createLuminanceSource; | |||
} | |||
} | |||
/// <summary> | |||
/// Optional: Gets or sets the function to create a binarizer object for a luminance source. | |||
/// If null then HybridBinarizer is used | |||
/// </summary> | |||
/// <value> | |||
/// The function to create a binarizer object. | |||
/// </value> | |||
protected Func<LuminanceSource, Binarizer> CreateBinarizer | |||
{ | |||
get | |||
{ | |||
return createBinarizer ?? defaultCreateBinarizer; | |||
} | |||
} | |||
/// <summary> | |||
/// Initializes a new instance of the <see cref="BarcodeReaderGeneric{T}"/> class. | |||
/// </summary> | |||
public BarcodeReaderGeneric() | |||
: this(new QRCodeReader(), null, defaultCreateBinarizer) | |||
{ | |||
} | |||
/// <summary> | |||
/// Initializes a new instance of the <see cref="BarcodeReaderGeneric{T}"/> class. | |||
/// </summary> | |||
/// <param name="reader">Sets the reader which should be used to find and decode the barcode. | |||
/// If null then MultiFormatReader is used</param> | |||
/// <param name="createLuminanceSource">Sets the function to create a luminance source object for a bitmap. | |||
/// If null, an exception is thrown when Decode is called</param> | |||
/// <param name="createBinarizer">Sets the function to create a binarizer object for a luminance source. | |||
/// If null then HybridBinarizer is used</param> | |||
public BarcodeReaderGeneric(Reader reader, | |||
#if !UNITY | |||
Func<T, LuminanceSource> createLuminanceSource, | |||
#else | |||
Func<T, int, int, LuminanceSource> createLuminanceSource, | |||
#endif | |||
Func<LuminanceSource, Binarizer> createBinarizer | |||
) | |||
: this(reader, createLuminanceSource, createBinarizer, null) | |||
{ | |||
} | |||
/// <summary> | |||
/// Initializes a new instance of the <see cref="BarcodeReaderGeneric{T}"/> class. | |||
/// </summary> | |||
/// <param name="reader">Sets the reader which should be used to find and decode the barcode. | |||
/// If null then MultiFormatReader is used</param> | |||
/// <param name="createLuminanceSource">Sets the function to create a luminance source object for a bitmap. | |||
/// If null, an exception is thrown when Decode is called</param> | |||
/// <param name="createBinarizer">Sets the function to create a binarizer object for a luminance source. | |||
/// If null then HybridBinarizer is used</param> | |||
/// <param name="createRGBLuminanceSource">Sets the function to create a luminance source object for a rgb array. | |||
/// If null the RGBLuminanceSource is used. The handler is only called when Decode with a byte[] array is called.</param> | |||
public BarcodeReaderGeneric(Reader reader, | |||
#if !UNITY | |||
Func<T, LuminanceSource> createLuminanceSource, | |||
#else | |||
Func<T, int, int, LuminanceSource> createLuminanceSource, | |||
#endif | |||
Func<LuminanceSource, Binarizer> createBinarizer, | |||
Func<byte[], int, int, RGBLuminanceSource.BitmapFormat, LuminanceSource> createRGBLuminanceSource | |||
) | |||
{ | |||
this.reader = reader ?? new QRCodeReader(); | |||
this.createLuminanceSource = createLuminanceSource; | |||
this.createBinarizer = createBinarizer ?? defaultCreateBinarizer; | |||
this.createRGBLuminanceSource = createRGBLuminanceSource ?? defaultCreateRGBLuminanceSource; | |||
Options.ValueChanged += (o, args) => usePreviousState = false; | |||
usePreviousState = false; | |||
} | |||
#if !PORTABLE | |||
#if !UNITY | |||
/// <summary> | |||
/// Decodes the specified barcode bitmap. | |||
/// </summary> | |||
/// <param name="barcodeBitmap">The barcode bitmap.</param> | |||
/// <returns>the result data or null</returns> | |||
public Result Decode(T barcodeBitmap) | |||
#else | |||
/// <summary> | |||
/// Decodes the specified barcode bitmap. | |||
/// </summary> | |||
/// <param name="rawRGB">raw bytes of the image in RGB order</param> | |||
/// <param name="width"></param> | |||
/// <param name="height"></param> | |||
/// <returns> | |||
/// the result data or null | |||
/// </returns> | |||
public Result Decode(T rawRGB, int width, int height) | |||
#endif | |||
{ | |||
if (CreateLuminanceSource == null) | |||
{ | |||
throw new InvalidOperationException("You have to declare a luminance source delegate."); | |||
} | |||
#if !UNITY | |||
if (barcodeBitmap == null) | |||
throw new ArgumentNullException("barcodeBitmap"); | |||
#else | |||
if (rawRGB == null) | |||
throw new ArgumentNullException("rawRGB"); | |||
#endif | |||
#if !UNITY | |||
var luminanceSource = CreateLuminanceSource(barcodeBitmap); | |||
#else | |||
var luminanceSource = CreateLuminanceSource(rawRGB, width, height); | |||
#endif | |||
return Decode(luminanceSource); | |||
} | |||
#endif | |||
/// <summary> | |||
/// Tries to decode a barcode within an image which is given by a luminance source. | |||
/// That method gives a chance to prepare a luminance source completely before calling | |||
/// the time consuming decoding method. On the other hand there is a chance to create | |||
/// a luminance source which is independent from external resources (like Bitmap objects) | |||
/// and the decoding call can be made in a background thread. | |||
/// </summary> | |||
/// <param name="luminanceSource">The luminance source.</param> | |||
/// <returns></returns> | |||
virtual public Result Decode(LuminanceSource luminanceSource) | |||
{ | |||
var result = default(Result); | |||
var binarizer = CreateBinarizer(luminanceSource); | |||
var binaryBitmap = new BinaryBitmap(binarizer); | |||
var multiformatReader = Reader as QRCodeReader; | |||
var rotationCount = 0; | |||
var rotationMaxCount = 1; | |||
if (AutoRotate) | |||
{ | |||
Options.Hints[DecodeHintType.TRY_HARDER_WITHOUT_ROTATION] = true; | |||
rotationMaxCount = 4; | |||
} | |||
else | |||
{ | |||
if (Options.Hints.ContainsKey(DecodeHintType.TRY_HARDER_WITHOUT_ROTATION)) | |||
Options.Hints.Remove(DecodeHintType.TRY_HARDER_WITHOUT_ROTATION); | |||
} | |||
for (; rotationCount < rotationMaxCount; rotationCount++) | |||
{ | |||
result = Reader.decode(binaryBitmap, Options.Hints); | |||
usePreviousState = true; | |||
if (result != null || | |||
!luminanceSource.RotateSupported || | |||
!AutoRotate) | |||
break; | |||
binaryBitmap = new BinaryBitmap(CreateBinarizer(luminanceSource.rotateCounterClockwise())); | |||
} | |||
if (result != null) | |||
{ | |||
if (result.ResultMetadata == null) | |||
{ | |||
result.putMetadata(ResultMetadataType.ORIENTATION, rotationCount * 90); | |||
} | |||
else if (!result.ResultMetadata.ContainsKey(ResultMetadataType.ORIENTATION)) | |||
{ | |||
result.ResultMetadata[ResultMetadataType.ORIENTATION] = rotationCount * 90; | |||
} | |||
else | |||
{ | |||
// perhaps the core decoder rotates the image already (can happen if TryHarder is specified) | |||
result.ResultMetadata[ResultMetadataType.ORIENTATION] = ((int)(result.ResultMetadata[ResultMetadataType.ORIENTATION]) + rotationCount * 90) % 360; | |||
} | |||
OnResultFound(result); | |||
} | |||
return result; | |||
} | |||
protected void OnResultsFound(IEnumerable<Result> results) | |||
{ | |||
if (ResultFound != null) | |||
{ | |||
foreach (var result in results) | |||
{ | |||
ResultFound(result); | |||
} | |||
} | |||
} | |||
protected void OnResultFound(Result result) | |||
{ | |||
if (ResultFound != null) | |||
{ | |||
ResultFound(result); | |||
} | |||
} | |||
protected void OnResultPointFound(ResultPoint resultPoint) | |||
{ | |||
if (explicitResultPointFound != null) | |||
{ | |||
explicitResultPointFound(resultPoint); | |||
} | |||
} | |||
/// <summary> | |||
/// Decodes the specified barcode bitmap. | |||
/// </summary> | |||
/// <param name="rawRGB">The image as byte[] array.</param> | |||
/// <param name="width">The width.</param> | |||
/// <param name="height">The height.</param> | |||
/// <param name="format">The format.</param> | |||
/// <returns> | |||
/// the result data or null | |||
/// </returns> | |||
public Result Decode(byte[] rawRGB, int width, int height, RGBLuminanceSource.BitmapFormat format) | |||
{ | |||
if (rawRGB == null) | |||
throw new ArgumentNullException("rawRGB"); | |||
var luminanceSource = createRGBLuminanceSource(rawRGB, width, height, format); | |||
return Decode(luminanceSource); | |||
} | |||
} | |||
} |
@@ -1,161 +0,0 @@ | |||
/* | |||
* Copyright 2012 ZXing.Net authors | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
using System; | |||
using System.Collections.Generic; | |||
#if !(SILVERLIGHT || NETFX_CORE) | |||
#if !UNITY | |||
#if !PORTABLE | |||
using System.Drawing; | |||
#endif | |||
#else | |||
using UnityEngine; | |||
#endif | |||
#elif NETFX_CORE | |||
using Windows.UI.Xaml.Media.Imaging; | |||
#else | |||
using System.Windows.Media.Imaging; | |||
#endif | |||
using ZXing.Common; | |||
namespace ZXing | |||
{ | |||
/// <summary> | |||
/// Interface for a smart class to decode the barcode inside a bitmap object | |||
/// </summary> | |||
public interface IBarcodeReader | |||
{ | |||
/// <summary> | |||
/// event is executed when a result point was found | |||
/// </summary> | |||
event Action<ResultPoint> ResultPointFound; | |||
/// <summary> | |||
/// event is executed when a result was found via decode | |||
/// </summary> | |||
event Action<Result> ResultFound; | |||
/// <summary> | |||
/// Gets or sets a flag which cause a deeper look into the bitmap | |||
/// </summary> | |||
/// <value> | |||
/// <c>true</c> if [try harder]; otherwise, <c>false</c>. | |||
/// </value> | |||
[Obsolete("Please use the Options.TryHarder property instead.")] | |||
bool TryHarder { get; set; } | |||
/// <summary> | |||
/// Image is a pure monochrome image of a barcode. | |||
/// </summary> | |||
/// <value> | |||
/// <c>true</c> if monochrome image of a barcode; otherwise, <c>false</c>. | |||
/// </value> | |||
[Obsolete("Please use the Options.PureBarcode property instead.")] | |||
bool PureBarcode { get; set; } | |||
/// <summary> | |||
/// Specifies what character encoding to use when decoding, where applicable (type String) | |||
/// </summary> | |||
/// <value> | |||
/// The character set. | |||
/// </value> | |||
[Obsolete("Please use the Options.CharacterSet property instead.")] | |||
string CharacterSet { get; set; } | |||
/// <summary> | |||
/// Image is known to be of one of a few possible formats. | |||
/// Maps to a {@link java.util.List} of {@link BarcodeFormat}s. | |||
/// </summary> | |||
/// <value> | |||
/// The possible formats. | |||
/// </value> | |||
[Obsolete("Please use the Options.PossibleFormats property instead.")] | |||
IList<BarcodeFormat> PossibleFormats { get; set; } | |||
/// <summary> | |||
/// Specifies some options which influence the decoding process | |||
/// </summary> | |||
DecodingOptions Options { get; set; } | |||
/// <summary> | |||
/// Decodes the specified barcode bitmap which is given by a generic byte array with the order RGB24. | |||
/// </summary> | |||
/// <param name="rawRGB">The image as RGB24 array.</param> | |||
/// <param name="width">The width.</param> | |||
/// <param name="height">The height.</param> | |||
/// <param name="format">The format.</param> | |||
/// <returns> | |||
/// the result data or null | |||
/// </returns> | |||
Result Decode(byte[] rawRGB, int width, int height, RGBLuminanceSource.BitmapFormat format); | |||
/// <summary> | |||
/// Tries to decode a barcode within an image which is given by a luminance source. | |||
/// That method gives a chance to prepare a luminance source completely before calling | |||
/// the time consuming decoding method. On the other hand there is a chance to create | |||
/// a luminance source which is independent from external resources (like Bitmap objects) | |||
/// and the decoding call can be made in a background thread. | |||
/// </summary> | |||
/// <param name="luminanceSource">The luminance source.</param> | |||
/// <returns></returns> | |||
Result Decode(LuminanceSource luminanceSource); | |||
#if MONOTOUCH | |||
/// <summary> | |||
/// Decodes the specified barcode bitmap. | |||
/// </summary> | |||
/// <param name="barcodeBitmap">The barcode bitmap.</param> | |||
/// <returns>the result data or null</returns> | |||
Result Decode(MonoTouch.UIKit.UIImage barcodeImage); | |||
#elif MONOANDROID | |||
/// <summary> | |||
/// Decodes the specified barcode bitmap. | |||
/// </summary> | |||
/// <param name="barcodeBitmap">The barcode bitmap.</param> | |||
/// <returns>the result data or null</returns> | |||
Result Decode(Android.Graphics.Bitmap barcodeImage); | |||
#else | |||
#if !PORTABLE | |||
#if !(SILVERLIGHT || NETFX_CORE) | |||
#if !UNITY | |||
/// <summary> | |||
/// Decodes the specified barcode bitmap. | |||
/// </summary> | |||
/// <param name="barcodeBitmap">The barcode bitmap.</param> | |||
/// <returns>the result data or null</returns> | |||
Result Decode(Bitmap barcodeBitmap); | |||
#else | |||
/// <summary> | |||
/// Decodes the specified barcode bitmap. | |||
/// </summary> | |||
/// <param name="rawColor32">The image as Color32 array.</param> | |||
/// <returns>the result data or null</returns> | |||
Result Decode(Color32[] rawColor32, int width, int height); | |||
#endif | |||
#else | |||
/// <summary> | |||
/// Decodes the specified barcode bitmap. | |||
/// </summary> | |||
/// <param name="barcodeBitmap">The barcode bitmap.</param> | |||
/// <returns>the result data or null</returns> | |||
Result Decode(WriteableBitmap barcodeBitmap); | |||
#endif | |||
#endif | |||
#endif | |||
} | |||
} |
@@ -1,123 +0,0 @@ | |||
/* | |||
* Copyright 2012 ZXing.Net authors | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
using System; | |||
using System.Collections.Generic; | |||
using ZXing.Common; | |||
namespace ZXing | |||
{ | |||
/// <summary> | |||
/// Interface for a smart class to decode the barcode inside a bitmap object | |||
/// </summary> | |||
/// <typeparam name="T">gives the type of the input data</typeparam> | |||
public interface IBarcodeReaderGeneric<T> | |||
{ | |||
/// <summary> | |||
/// event is executed when a result point was found | |||
/// </summary> | |||
event Action<ResultPoint> ResultPointFound; | |||
/// <summary> | |||
/// event is executed when a result was found via decode | |||
/// </summary> | |||
event Action<Result> ResultFound; | |||
/// <summary> | |||
/// Gets or sets a flag which cause a deeper look into the bitmap | |||
/// </summary> | |||
/// <value> | |||
/// <c>true</c> if [try harder]; otherwise, <c>false</c>. | |||
/// </value> | |||
[Obsolete("Please use the Options.TryHarder property instead.")] | |||
bool TryHarder { get; set; } | |||
/// <summary> | |||
/// Image is a pure monochrome image of a barcode. | |||
/// </summary> | |||
/// <value> | |||
/// <c>true</c> if monochrome image of a barcode; otherwise, <c>false</c>. | |||
/// </value> | |||
[Obsolete("Please use the Options.PureBarcode property instead.")] | |||
bool PureBarcode { get; set; } | |||
/// <summary> | |||
/// Specifies what character encoding to use when decoding, where applicable (type String) | |||
/// </summary> | |||
/// <value> | |||
/// The character set. | |||
/// </value> | |||
[Obsolete("Please use the Options.CharacterSet property instead.")] | |||
string CharacterSet { get; set; } | |||
/// <summary> | |||
/// Image is known to be of one of a few possible formats. | |||
/// Maps to a {@link java.util.List} of {@link BarcodeFormat}s. | |||
/// </summary> | |||
/// <value> | |||
/// The possible formats. | |||
/// </value> | |||
[Obsolete("Please use the Options.PossibleFormats property instead.")] | |||
IList<BarcodeFormat> PossibleFormats { get; set; } | |||
/// <summary> | |||
/// Specifies some options which influence the decoding process | |||
/// </summary> | |||
DecodingOptions Options { get; set; } | |||
/// <summary> | |||
/// Decodes the specified barcode bitmap which is given by a generic byte array. | |||
/// </summary> | |||
/// <param name="rawRGB">The barcode bitmap.</param> | |||
/// <param name="width">The width.</param> | |||
/// <param name="height">The height.</param> | |||
/// <param name="format">The format.</param> | |||
/// <returns> | |||
/// the result data or null | |||
/// </returns> | |||
Result Decode(byte[] rawRGB, int width, int height, RGBLuminanceSource.BitmapFormat format); | |||
/// <summary> | |||
/// Tries to decode a barcode within an image which is given by a luminance source. | |||
/// That method gives a chance to prepare a luminance source completely before calling | |||
/// the time consuming decoding method. On the other hand there is a chance to create | |||
/// a luminance source which is independent from external resources (like Bitmap objects) | |||
/// and the decoding call can be made in a background thread. | |||
/// </summary> | |||
/// <param name="luminanceSource">The luminance source.</param> | |||
/// <returns></returns> | |||
Result Decode(LuminanceSource luminanceSource); | |||
#if !PORTABLE | |||
#if !UNITY | |||
/// <summary> | |||
/// Decodes the specified barcode bitmap. | |||
/// </summary> | |||
/// <param name="barcodeBitmap">The barcode bitmap.</param> | |||
/// <returns>the result data or null</returns> | |||
Result Decode(T barcodeBitmap); | |||
#else | |||
/// <summary> | |||
/// Decodes the specified barcode bitmap. | |||
/// </summary> | |||
/// <param name="rawRGB">The barcode bitmap.</param> | |||
/// <returns>the result data or null</returns> | |||
Result Decode(T rawRGB, int width, int height); | |||
#endif | |||
#endif | |||
} | |||
} |
@@ -1,314 +0,0 @@ | |||
/* | |||
* Copyright 2012 ZXing.Net authors | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
using System; | |||
namespace ZXing | |||
{ | |||
/// <summary> | |||
/// Luminance source class which support different formats of images. | |||
/// </summary> | |||
public partial class RGBLuminanceSource : BaseLuminanceSource | |||
{ | |||
/// <summary> | |||
/// enumeration of supported bitmap format which the RGBLuminanceSource can process | |||
/// </summary> | |||
public enum BitmapFormat | |||
{ | |||
/// <summary> | |||
/// format of the byte[] isn't known. RGBLuminanceSource tries to determine the best possible value | |||
/// </summary> | |||
Unknown, | |||
/// <summary> | |||
/// grayscale array, the byte array is a luminance array with 1 byte per pixel | |||
/// </summary> | |||
Gray8, | |||
/// <summary> | |||
/// 3 bytes per pixel with the channels red, green and blue | |||
/// </summary> | |||
RGB24, | |||
/// <summary> | |||
/// 4 bytes per pixel with the channels red, green and blue | |||
/// </summary> | |||
RGB32, | |||
/// <summary> | |||
/// 4 bytes per pixel with the channels alpha, red, green and blue | |||
/// </summary> | |||
ARGB32, | |||
/// <summary> | |||
/// 3 bytes per pixel with the channels blue, green and red | |||
/// </summary> | |||
BGR24, | |||
/// <summary> | |||
/// 4 bytes per pixel with the channels blue, green and red | |||
/// </summary> | |||
BGR32, | |||
/// <summary> | |||
/// 4 bytes per pixel with the channels blue, green, red and alpha | |||
/// </summary> | |||
BGRA32, | |||
/// <summary> | |||
/// 2 bytes per pixel, 5 bit red, 6 bits green and 5 bits blue | |||
/// </summary> | |||
RGB565, | |||
/// <summary> | |||
/// 4 bytes per pixel with the channels red, green, blue and alpha | |||
/// </summary> | |||
RGBA32, | |||
} | |||
/// <summary> | |||
/// Initializes a new instance of the <see cref="RGBLuminanceSource"/> class. | |||
/// </summary> | |||
/// <param name="width">The width.</param> | |||
/// <param name="height">The height.</param> | |||
protected RGBLuminanceSource(int width, int height) | |||
: base(width, height) | |||
{ | |||
} | |||
/// <summary> | |||
/// Initializes a new instance of the <see cref="RGBLuminanceSource"/> class. | |||
/// It supports a byte array with 3 bytes per pixel (RGB24). | |||
/// </summary> | |||
/// <param name="rgbRawBytes">The RGB raw bytes.</param> | |||
/// <param name="width">The width.</param> | |||
/// <param name="height">The height.</param> | |||
public RGBLuminanceSource(byte[] rgbRawBytes, int width, int height) | |||
: this(rgbRawBytes, width, height, BitmapFormat.RGB24) | |||
{ | |||
} | |||
/// <summary> | |||
/// Initializes a new instance of the <see cref="RGBLuminanceSource"/> class. | |||
/// It supports a byte array with 1 byte per pixel (Gray8). | |||
/// That means the whole array consists of the luminance values (grayscale). | |||
/// </summary> | |||
/// <param name="luminanceArray">The luminance array.</param> | |||
/// <param name="width">The width.</param> | |||
/// <param name="height">The height.</param> | |||
/// <param name="is8Bit">if set to <c>true</c> [is8 bit].</param> | |||
[Obsolete("Use RGBLuminanceSource(luminanceArray, width, height, BitmapFormat.Gray8)")] | |||
public RGBLuminanceSource(byte[] luminanceArray, int width, int height, bool is8Bit) | |||
: this(luminanceArray, width, height, BitmapFormat.Gray8) | |||
{ | |||
} | |||
/// <summary> | |||
/// Initializes a new instance of the <see cref="RGBLuminanceSource"/> class. | |||
/// It supports a byte array with 3 bytes per pixel (RGB24). | |||
/// </summary> | |||
/// <param name="rgbRawBytes">The RGB raw bytes.</param> | |||
/// <param name="width">The width.</param> | |||
/// <param name="height">The height.</param> | |||
/// <param name="bitmapFormat">The bitmap format.</param> | |||
public RGBLuminanceSource(byte[] rgbRawBytes, int width, int height, BitmapFormat bitmapFormat) | |||
: base(width, height) | |||
{ | |||
CalculateLuminance(rgbRawBytes, bitmapFormat); | |||
} | |||
/// <summary> | |||
/// Should create a new luminance source with the right class type. | |||
/// The method is used in methods crop and rotate. | |||
/// </summary> | |||
/// <param name="newLuminances">The new luminances.</param> | |||
/// <param name="width">The width.</param> | |||
/// <param name="height">The height.</param> | |||
/// <returns></returns> | |||
protected override LuminanceSource CreateLuminanceSource(byte[] newLuminances, int width, int height) | |||
{ | |||
return new RGBLuminanceSource(width, height) { luminances = newLuminances }; | |||
} | |||
private static BitmapFormat DetermineBitmapFormat(byte[] rgbRawBytes, int width, int height) | |||
{ | |||
var square = width*height; | |||
var byteperpixel = rgbRawBytes.Length/square; | |||
switch (byteperpixel) | |||
{ | |||
case 1: | |||
return BitmapFormat.Gray8; | |||
case 2: | |||
return BitmapFormat.RGB565; | |||
case 3: | |||
return BitmapFormat.RGB24; | |||
case 4: | |||
return BitmapFormat.RGB32; | |||
default: | |||
throw new ArgumentException("The bitmap format could not be determined. Please specify the correct value."); | |||
} | |||
} | |||
protected void CalculateLuminance(byte[] rgbRawBytes, BitmapFormat bitmapFormat) | |||
{ | |||
if (bitmapFormat == BitmapFormat.Unknown) | |||
{ | |||
bitmapFormat = DetermineBitmapFormat(rgbRawBytes, Width, Height); | |||
} | |||
switch (bitmapFormat) | |||
{ | |||
case BitmapFormat.Gray8: | |||
Buffer.BlockCopy(rgbRawBytes, 0, luminances, 0, rgbRawBytes.Length < luminances.Length ? rgbRawBytes.Length : luminances.Length); | |||
break; | |||
case BitmapFormat.RGB24: | |||
CalculateLuminanceRGB24(rgbRawBytes); | |||
break; | |||
case BitmapFormat.BGR24: | |||
CalculateLuminanceBGR24(rgbRawBytes); | |||
break; | |||
case BitmapFormat.RGB32: | |||
CalculateLuminanceRGB32(rgbRawBytes); | |||
break; | |||
case BitmapFormat.BGR32: | |||
CalculateLuminanceBGR32(rgbRawBytes); | |||
break; | |||
case BitmapFormat.RGBA32: | |||
CalculateLuminanceRGBA32(rgbRawBytes); | |||
break; | |||
case BitmapFormat.ARGB32: | |||
CalculateLuminanceARGB32(rgbRawBytes); | |||
break; | |||
case BitmapFormat.BGRA32: | |||
CalculateLuminanceBGRA32(rgbRawBytes); | |||
break; | |||
case BitmapFormat.RGB565: | |||
CalculateLuminanceRGB565(rgbRawBytes); | |||
break; | |||
default: | |||
throw new ArgumentException("The bitmap format isn't supported.", bitmapFormat.ToString()); | |||
} | |||
} | |||
private void CalculateLuminanceRGB565(byte[] rgb565RawData) | |||
{ | |||
var luminanceIndex = 0; | |||
for (var index = 0; index < rgb565RawData.Length && luminanceIndex < luminances.Length; index += 2, luminanceIndex++) | |||
{ | |||
var byte1 = rgb565RawData[index]; | |||
var byte2 = rgb565RawData[index + 1]; | |||
var b5 = byte1 & 0x1F; | |||
var g5 = (((byte1 & 0xE0) >> 5) | ((byte2 & 0x03) << 3)) & 0x1F; | |||
var r5 = (byte2 >> 2) & 0x1F; | |||
var r8 = (r5 * 527 + 23) >> 6; | |||
var g8 = (g5 * 527 + 23) >> 6; | |||
var b8 = (b5 * 527 + 23) >> 6; | |||
// cheap, not fully accurate conversion | |||
//var pixel = (byte2 << 8) | byte1; | |||
//b8 = (((pixel) & 0x001F) << 3); | |||
//g8 = (((pixel) & 0x07E0) >> 2) & 0xFF; | |||
//r8 = (((pixel) & 0xF800) >> 8); | |||
luminances[luminanceIndex] = (byte)((RChannelWeight * r8 + GChannelWeight * g8 + BChannelWeight * b8) >> ChannelWeight); | |||
} | |||
} | |||
private void CalculateLuminanceRGB24(byte[] rgbRawBytes) | |||
{ | |||
for (int rgbIndex = 0, luminanceIndex = 0; rgbIndex < rgbRawBytes.Length && luminanceIndex < luminances.Length; luminanceIndex++) | |||
{ | |||
// Calculate luminance cheaply, favoring green. | |||
int r = rgbRawBytes[rgbIndex++]; | |||
int g = rgbRawBytes[rgbIndex++]; | |||
int b = rgbRawBytes[rgbIndex++]; | |||
luminances[luminanceIndex] = (byte)((RChannelWeight * r + GChannelWeight * g + BChannelWeight * b) >> ChannelWeight); | |||
} | |||
} | |||
private void CalculateLuminanceBGR24(byte[] rgbRawBytes) | |||
{ | |||
for (int rgbIndex = 0, luminanceIndex = 0; rgbIndex < rgbRawBytes.Length && luminanceIndex < luminances.Length; luminanceIndex++) | |||
{ | |||
// Calculate luminance cheaply, favoring green. | |||
int b = rgbRawBytes[rgbIndex++]; | |||
int g = rgbRawBytes[rgbIndex++]; | |||
int r = rgbRawBytes[rgbIndex++]; | |||
luminances[luminanceIndex] = (byte)((RChannelWeight * r + GChannelWeight * g + BChannelWeight * b) >> ChannelWeight); | |||
} | |||
} | |||
private void CalculateLuminanceRGB32(byte[] rgbRawBytes) | |||
{ | |||
for (int rgbIndex = 0, luminanceIndex = 0; rgbIndex < rgbRawBytes.Length && luminanceIndex < luminances.Length; luminanceIndex++) | |||
{ | |||
// Calculate luminance cheaply, favoring green. | |||
int r = rgbRawBytes[rgbIndex++]; | |||
int g = rgbRawBytes[rgbIndex++]; | |||
int b = rgbRawBytes[rgbIndex++]; | |||
rgbIndex++; | |||
luminances[luminanceIndex] = (byte)((RChannelWeight * r + GChannelWeight * g + BChannelWeight * b) >> ChannelWeight); | |||
} | |||
} | |||
private void CalculateLuminanceBGR32(byte[] rgbRawBytes) | |||
{ | |||
for (int rgbIndex = 0, luminanceIndex = 0; rgbIndex < rgbRawBytes.Length && luminanceIndex < luminances.Length; luminanceIndex++) | |||
{ | |||
// Calculate luminance cheaply, favoring green. | |||
int b = rgbRawBytes[rgbIndex++]; | |||
int g = rgbRawBytes[rgbIndex++]; | |||
int r = rgbRawBytes[rgbIndex++]; | |||
rgbIndex++; | |||
luminances[luminanceIndex] = (byte)((RChannelWeight * r + GChannelWeight * g + BChannelWeight * b) >> ChannelWeight); | |||
} | |||
} | |||
private void CalculateLuminanceBGRA32(byte[] rgbRawBytes) | |||
{ | |||
for (int rgbIndex = 0, luminanceIndex = 0; rgbIndex < rgbRawBytes.Length && luminanceIndex < luminances.Length; luminanceIndex++) | |||
{ | |||
// Calculate luminance cheaply, favoring green. | |||
var b = rgbRawBytes[rgbIndex++]; | |||
var g = rgbRawBytes[rgbIndex++]; | |||
var r = rgbRawBytes[rgbIndex++]; | |||
var alpha = rgbRawBytes[rgbIndex++]; | |||
var luminance = (byte)((RChannelWeight * r + GChannelWeight * g + BChannelWeight * b) >> ChannelWeight); | |||
luminances[luminanceIndex] = (byte)(((luminance * alpha) >> 8) + (255 * (255 - alpha) >> 8)); | |||
} | |||
} | |||
private void CalculateLuminanceRGBA32(byte[] rgbRawBytes) | |||
{ | |||
for (int rgbIndex = 0, luminanceIndex = 0; rgbIndex < rgbRawBytes.Length && luminanceIndex < luminances.Length; luminanceIndex++) | |||
{ | |||
// Calculate luminance cheaply, favoring green. | |||
var r = rgbRawBytes[rgbIndex++]; | |||
var g = rgbRawBytes[rgbIndex++]; | |||
var b = rgbRawBytes[rgbIndex++]; | |||
var alpha = rgbRawBytes[rgbIndex++]; | |||
var luminance = (byte)((RChannelWeight * r + GChannelWeight * g + BChannelWeight * b) >> ChannelWeight); | |||
luminances[luminanceIndex] = (byte)(((luminance * alpha) >> 8) + (255 * (255 - alpha) >> 8)); | |||
} | |||
} | |||
private void CalculateLuminanceARGB32(byte[] rgbRawBytes) | |||
{ | |||
for (int rgbIndex = 0, luminanceIndex = 0; rgbIndex < rgbRawBytes.Length && luminanceIndex < luminances.Length; luminanceIndex++) | |||
{ | |||
// Calculate luminance cheaply, favoring green. | |||
var alpha = rgbRawBytes[rgbIndex++]; | |||
var r = rgbRawBytes[rgbIndex++]; | |||
var g = rgbRawBytes[rgbIndex++]; | |||
var b = rgbRawBytes[rgbIndex++]; | |||
var luminance = (byte)((RChannelWeight * r + GChannelWeight * g + BChannelWeight * b) >> ChannelWeight); | |||
luminances[luminanceIndex] = (byte)(((luminance * alpha) >> 8) + (255 * (255 - alpha) >> 8)); | |||
} | |||
} | |||
} | |||
} |
@@ -71,8 +71,6 @@ | |||
</ItemGroup> | |||
<ItemGroup> | |||
<Compile Include="3rd\zxing\BarcodeFormat.cs" /> | |||
<Compile Include="3rd\zxing\BarcodeReader.cs" /> | |||
<Compile Include="3rd\zxing\BarcodeReaderGeneric.cs" /> | |||
<Compile Include="3rd\zxing\BaseLuminanceSource.cs" /> | |||
<Compile Include="3rd\zxing\Binarizer.cs" /> | |||
<Compile Include="3rd\zxing\BinaryBitmap.cs" /> | |||
@@ -101,8 +99,6 @@ | |||
<Compile Include="3rd\zxing\common\StringUtils.cs" /> | |||
<Compile Include="3rd\zxing\DecodeHintType.cs" /> | |||
<Compile Include="3rd\zxing\EncodeHintType.cs" /> | |||
<Compile Include="3rd\zxing\IBarcodeReader.cs" /> | |||
<Compile Include="3rd\zxing\IBarcodeReaderGeneric.cs" /> | |||
<Compile Include="3rd\zxing\LuminanceSource.cs" /> | |||
<Compile Include="3rd\zxing\net2.0\Action.cs" /> | |||
<Compile Include="3rd\zxing\net2.0\Func.cs" /> | |||
@@ -138,7 +134,6 @@ | |||
<Compile Include="3rd\zxing\ResultMetadataType.cs" /> | |||
<Compile Include="3rd\zxing\ResultPoint.cs" /> | |||
<Compile Include="3rd\zxing\ResultPointCallback.cs" /> | |||
<Compile Include="3rd\zxing\RGBLuminanceSource.cs" /> | |||
<Compile Include="3rd\zxing\WriterException.cs" /> | |||
<Compile Include="Controller\AutoStartup.cs" /> | |||
<Compile Include="Controller\FileManager.cs" /> | |||