Showing
16 changed files
with
193 additions
and
87 deletions
| @@ -17,7 +17,7 @@ dependencies: | @@ -17,7 +17,7 @@ dependencies: | ||
| 17 | url_launcher: ^6.0.6 | 17 | url_launcher: ^6.0.6 |
| 18 | 18 | ||
| 19 | dev_dependencies: | 19 | dev_dependencies: |
| 20 | - flutter_launcher_icons: ^0.10.0 | 20 | + # flutter_launcher_icons: ^0.10.0 |
| 21 | flutter_lints: ^1.0.4 | 21 | flutter_lints: ^1.0.4 |
| 22 | flutter_test: | 22 | flutter_test: |
| 23 | sdk: flutter | 23 | sdk: flutter |
| 1 | # Changelog | 1 | # Changelog |
| 2 | 2 | ||
| 3 | -## 3.8.5 | 3 | +## 3.9.0 |
| 4 | 4 | ||
| 5 | - Improve TTF Writer compatibility | 5 | - Improve TTF Writer compatibility |
| 6 | - Apply THE BIDIRECTIONAL ALGORITHM using dart_bidi [Milad akarie] | 6 | - Apply THE BIDIRECTIONAL ALGORITHM using dart_bidi [Milad akarie] |
| 7 | - Add Inseparable Widget | 7 | - Add Inseparable Widget |
| 8 | - Fix unit tests | 8 | - Fix unit tests |
| 9 | +- Update Image dependency | ||
| 9 | 10 | ||
| 10 | ## 3.8.4 | 11 | ## 3.8.4 |
| 11 | 12 |
| @@ -41,4 +41,5 @@ export 'src/pdf/obj/smask.dart'; | @@ -41,4 +41,5 @@ export 'src/pdf/obj/smask.dart'; | ||
| 41 | export 'src/pdf/obj/ttffont.dart'; | 41 | export 'src/pdf/obj/ttffont.dart'; |
| 42 | export 'src/pdf/page_format.dart'; | 42 | export 'src/pdf/page_format.dart'; |
| 43 | export 'src/pdf/point.dart'; | 43 | export 'src/pdf/point.dart'; |
| 44 | +export 'src/pdf/raster.dart'; | ||
| 44 | export 'src/pdf/rect.dart'; | 45 | export 'src/pdf/rect.dart'; |
| @@ -21,6 +21,7 @@ import 'package:image/image.dart' as im; | @@ -21,6 +21,7 @@ import 'package:image/image.dart' as im; | ||
| 21 | import '../data_types.dart'; | 21 | import '../data_types.dart'; |
| 22 | import '../document.dart'; | 22 | import '../document.dart'; |
| 23 | import '../exif.dart'; | 23 | import '../exif.dart'; |
| 24 | +import '../raster.dart'; | ||
| 24 | import 'xobject.dart'; | 25 | import 'xobject.dart'; |
| 25 | 26 | ||
| 26 | /// Represents the position of the first pixel in the data stream | 27 | /// Represents the position of the first pixel in the data stream |
| @@ -152,12 +153,13 @@ class PdfImage extends PdfXObject { | @@ -152,12 +153,13 @@ class PdfImage extends PdfXObject { | ||
| 152 | required im.Image image, | 153 | required im.Image image, |
| 153 | PdfImageOrientation orientation = PdfImageOrientation.topLeft, | 154 | PdfImageOrientation orientation = PdfImageOrientation.topLeft, |
| 154 | }) { | 155 | }) { |
| 156 | + final raster = PdfRasterBase.fromImage(image); | ||
| 155 | return PdfImage( | 157 | return PdfImage( |
| 156 | pdfDocument, | 158 | pdfDocument, |
| 157 | - image: image.getBytes(format: im.Format.rgba), | ||
| 158 | - width: image.width, | ||
| 159 | - height: image.height, | ||
| 160 | - alpha: image.channels == im.Channels.rgba, | 159 | + image: raster.pixels, |
| 160 | + width: raster.width, | ||
| 161 | + height: raster.height, | ||
| 162 | + alpha: raster.alpha, | ||
| 161 | orientation: orientation, | 163 | orientation: orientation, |
| 162 | ); | 164 | ); |
| 163 | } | 165 | } |
pdf/lib/src/pdf/raster.dart
0 → 100644
| 1 | +/* | ||
| 2 | + * Copyright (C) 2017, David PHAM-VAN <dev.nfet.net@gmail.com> | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | + | ||
| 17 | +import 'dart:async'; | ||
| 18 | +import 'dart:typed_data'; | ||
| 19 | + | ||
| 20 | +import 'package:image/image.dart' as im; | ||
| 21 | + | ||
| 22 | +import 'color.dart'; | ||
| 23 | + | ||
| 24 | +/// Represents a bitmap image | ||
| 25 | +class PdfRasterBase { | ||
| 26 | + /// Create a bitmap image | ||
| 27 | + const PdfRasterBase( | ||
| 28 | + this.width, | ||
| 29 | + this.height, | ||
| 30 | + this.alpha, | ||
| 31 | + this.pixels, | ||
| 32 | + ); | ||
| 33 | + | ||
| 34 | + factory PdfRasterBase.fromImage(im.Image image) { | ||
| 35 | + final data = image | ||
| 36 | + .convert(format: im.Format.uint8, numChannels: 4, noAnimation: true) | ||
| 37 | + .toUint8List(); | ||
| 38 | + return PdfRasterBase(image.width, image.height, true, data); | ||
| 39 | + } | ||
| 40 | + | ||
| 41 | + factory PdfRasterBase.fromPng(Uint8List png) { | ||
| 42 | + final img = im.PngDecoder().decode(png)!; | ||
| 43 | + return PdfRasterBase.fromImage(img); | ||
| 44 | + } | ||
| 45 | + | ||
| 46 | + static im.Image shadowRect( | ||
| 47 | + double width, | ||
| 48 | + double height, | ||
| 49 | + double spreadRadius, | ||
| 50 | + double blurRadius, | ||
| 51 | + PdfColor color, | ||
| 52 | + ) { | ||
| 53 | + final shadow = im.Image( | ||
| 54 | + width: (width + spreadRadius * 2).round(), | ||
| 55 | + height: (height + spreadRadius * 2).round(), | ||
| 56 | + format: im.Format.uint8, | ||
| 57 | + numChannels: 4, | ||
| 58 | + ); | ||
| 59 | + | ||
| 60 | + im.fillRect( | ||
| 61 | + shadow, | ||
| 62 | + x1: spreadRadius.round(), | ||
| 63 | + y1: spreadRadius.round(), | ||
| 64 | + x2: (spreadRadius + width).round(), | ||
| 65 | + y2: (spreadRadius + height).round(), | ||
| 66 | + color: im.ColorUint8(4) | ||
| 67 | + ..r = color.red * 255 | ||
| 68 | + ..g = color.green * 255 | ||
| 69 | + ..b = color.blue * 255 | ||
| 70 | + ..a = color.alpha * 255, | ||
| 71 | + ); | ||
| 72 | + | ||
| 73 | + return im.gaussianBlur(shadow, radius: blurRadius.round()); | ||
| 74 | + } | ||
| 75 | + | ||
| 76 | + static im.Image shadowEllipse( | ||
| 77 | + double width, | ||
| 78 | + double height, | ||
| 79 | + double spreadRadius, | ||
| 80 | + double blurRadius, | ||
| 81 | + PdfColor color, | ||
| 82 | + ) { | ||
| 83 | + final shadow = im.Image( | ||
| 84 | + width: (width + spreadRadius * 2).round(), | ||
| 85 | + height: (height + spreadRadius * 2).round(), | ||
| 86 | + format: im.Format.uint8, | ||
| 87 | + numChannels: 4, | ||
| 88 | + ); | ||
| 89 | + | ||
| 90 | + im.fillCircle( | ||
| 91 | + shadow, | ||
| 92 | + x: (spreadRadius + width / 2).round(), | ||
| 93 | + y: (spreadRadius + height / 2).round(), | ||
| 94 | + radius: (width / 2).round(), | ||
| 95 | + color: im.ColorUint8(4) | ||
| 96 | + ..r = color.red * 255 | ||
| 97 | + ..g = color.green * 255 | ||
| 98 | + ..b = color.blue * 255 | ||
| 99 | + ..a = color.alpha * 255, | ||
| 100 | + ); | ||
| 101 | + | ||
| 102 | + return im.gaussianBlur(shadow, radius: blurRadius.round()); | ||
| 103 | + } | ||
| 104 | + | ||
| 105 | + /// The width of the image | ||
| 106 | + final int width; | ||
| 107 | + | ||
| 108 | + /// The height of the image | ||
| 109 | + final int height; | ||
| 110 | + | ||
| 111 | + /// The alpha channel is used | ||
| 112 | + final bool alpha; | ||
| 113 | + | ||
| 114 | + /// The raw RGBA pixels of the image | ||
| 115 | + final Uint8List pixels; | ||
| 116 | + | ||
| 117 | + @override | ||
| 118 | + String toString() => 'Image ${width}x$height ${width * height * 4} bytes'; | ||
| 119 | + | ||
| 120 | + /// Convert to a PNG image | ||
| 121 | + Future<Uint8List> toPng() async { | ||
| 122 | + final img = asImage(); | ||
| 123 | + return im.PngEncoder().encode(img); | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | + /// Returns the image as an [Image] object from the pub:image library | ||
| 127 | + im.Image asImage() { | ||
| 128 | + return im.Image.fromBytes( | ||
| 129 | + width: width, | ||
| 130 | + height: height, | ||
| 131 | + bytes: pixels.buffer, | ||
| 132 | + format: im.Format.uint8, | ||
| 133 | + numChannels: 4, | ||
| 134 | + ); | ||
| 135 | + } | ||
| 136 | +} |
| @@ -15,6 +15,7 @@ | @@ -15,6 +15,7 @@ | ||
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | import 'dart:convert'; | 17 | import 'dart:convert'; |
| 18 | +import 'dart:typed_data'; | ||
| 18 | 19 | ||
| 19 | import 'package:image/image.dart' as im; | 20 | import 'package:image/image.dart' as im; |
| 20 | import 'package:vector_math/vector_math_64.dart'; | 21 | import 'package:vector_math/vector_math_64.dart'; |
| @@ -74,7 +75,7 @@ class SvgImg extends SvgOperation { | @@ -74,7 +75,7 @@ class SvgImg extends SvgOperation { | ||
| 74 | final img = im.decodeImage(bytes)!; | 75 | final img = im.decodeImage(bytes)!; |
| 75 | image = PdfImage( | 76 | image = PdfImage( |
| 76 | painter.document, | 77 | painter.document, |
| 77 | - image: img.data.buffer.asUint8List(), | 78 | + image: img.data?.buffer.asUint8List() ?? Uint8List(0), |
| 78 | width: img.width, | 79 | width: img.width, |
| 79 | height: img.height, | 80 | height: img.height, |
| 80 | ); | 81 | ); |
| @@ -16,7 +16,6 @@ | @@ -16,7 +16,6 @@ | ||
| 16 | 16 | ||
| 17 | import 'dart:math' as math; | 17 | import 'dart:math' as math; |
| 18 | 18 | ||
| 19 | -import 'package:image/image.dart' as im; | ||
| 20 | import 'package:meta/meta.dart'; | 19 | import 'package:meta/meta.dart'; |
| 21 | import 'package:vector_math/vector_math_64.dart'; | 20 | import 'package:vector_math/vector_math_64.dart'; |
| 22 | 21 | ||
| @@ -251,45 +250,6 @@ class BoxShadow { | @@ -251,45 +250,6 @@ class BoxShadow { | ||
| 251 | final PdfPoint offset; | 250 | final PdfPoint offset; |
| 252 | final double blurRadius; | 251 | final double blurRadius; |
| 253 | final double spreadRadius; | 252 | final double spreadRadius; |
| 254 | - | ||
| 255 | - im.Image _rect(double width, double height) { | ||
| 256 | - final shadow = im.Image( | ||
| 257 | - (width + spreadRadius * 2).round(), | ||
| 258 | - (height + spreadRadius * 2).round(), | ||
| 259 | - ); | ||
| 260 | - | ||
| 261 | - im.fillRect( | ||
| 262 | - shadow, | ||
| 263 | - spreadRadius.round(), | ||
| 264 | - spreadRadius.round(), | ||
| 265 | - (spreadRadius + width).round(), | ||
| 266 | - (spreadRadius + height).round(), | ||
| 267 | - color.toInt(), | ||
| 268 | - ); | ||
| 269 | - | ||
| 270 | - im.gaussianBlur(shadow, blurRadius.round()); | ||
| 271 | - | ||
| 272 | - return shadow; | ||
| 273 | - } | ||
| 274 | - | ||
| 275 | - im.Image _ellipse(double width, double height) { | ||
| 276 | - final shadow = im.Image( | ||
| 277 | - (width + spreadRadius * 2).round(), | ||
| 278 | - (height + spreadRadius * 2).round(), | ||
| 279 | - ); | ||
| 280 | - | ||
| 281 | - im.fillCircle( | ||
| 282 | - shadow, | ||
| 283 | - (spreadRadius + width / 2).round(), | ||
| 284 | - (spreadRadius + height / 2).round(), | ||
| 285 | - (width / 2).round(), | ||
| 286 | - color.toInt(), | ||
| 287 | - ); | ||
| 288 | - | ||
| 289 | - im.gaussianBlur(shadow, blurRadius.round()); | ||
| 290 | - | ||
| 291 | - return shadow; | ||
| 292 | - } | ||
| 293 | } | 253 | } |
| 294 | 254 | ||
| 295 | enum BoxShape { circle, rectangle } | 255 | enum BoxShape { circle, rectangle } |
| @@ -329,7 +289,8 @@ class BoxDecoration { | @@ -329,7 +289,8 @@ class BoxDecoration { | ||
| 329 | if (borderRadius == null) { | 289 | if (borderRadius == null) { |
| 330 | if (boxShadow != null) { | 290 | if (boxShadow != null) { |
| 331 | for (final s in boxShadow!) { | 291 | for (final s in boxShadow!) { |
| 332 | - final i = s._rect(box.width, box.height); | 292 | + final i = PdfRasterBase.shadowRect(box.width, box.height, |
| 293 | + s.spreadRadius, s.blurRadius, s.color); | ||
| 333 | final m = PdfImage.fromImage(context.document, image: i); | 294 | final m = PdfImage.fromImage(context.document, image: i); |
| 334 | context.canvas.drawImage( | 295 | context.canvas.drawImage( |
| 335 | m, | 296 | m, |
| @@ -342,7 +303,8 @@ class BoxDecoration { | @@ -342,7 +303,8 @@ class BoxDecoration { | ||
| 342 | } else { | 303 | } else { |
| 343 | if (boxShadow != null) { | 304 | if (boxShadow != null) { |
| 344 | for (final s in boxShadow!) { | 305 | for (final s in boxShadow!) { |
| 345 | - final i = s._rect(box.width, box.height); | 306 | + final i = PdfRasterBase.shadowRect(box.width, box.height, |
| 307 | + s.spreadRadius, s.blurRadius, s.color); | ||
| 346 | final m = PdfImage.fromImage(context.document, image: i); | 308 | final m = PdfImage.fromImage(context.document, image: i); |
| 347 | context.canvas.drawImage( | 309 | context.canvas.drawImage( |
| 348 | m, | 310 | m, |
| @@ -357,7 +319,8 @@ class BoxDecoration { | @@ -357,7 +319,8 @@ class BoxDecoration { | ||
| 357 | case BoxShape.circle: | 319 | case BoxShape.circle: |
| 358 | if (boxShadow != null && box.width == box.height) { | 320 | if (boxShadow != null && box.width == box.height) { |
| 359 | for (final s in boxShadow!) { | 321 | for (final s in boxShadow!) { |
| 360 | - final i = s._ellipse(box.width, box.height); | 322 | + final i = PdfRasterBase.shadowEllipse(box.width, box.height, |
| 323 | + s.spreadRadius, s.blurRadius, s.color); | ||
| 361 | final m = PdfImage.fromImage(context.document, image: i); | 324 | final m = PdfImage.fromImage(context.document, image: i); |
| 362 | context.canvas.drawImage( | 325 | context.canvas.drawImage( |
| 363 | m, | 326 | m, |
| @@ -187,6 +187,6 @@ class RawImage extends ImageImage { | @@ -187,6 +187,6 @@ class RawImage extends ImageImage { | ||
| 187 | required int height, | 187 | required int height, |
| 188 | PdfImageOrientation? orientation, | 188 | PdfImageOrientation? orientation, |
| 189 | double? dpi, | 189 | double? dpi, |
| 190 | - }) : super(im.Image.fromBytes(width, height, bytes), | 190 | + }) : super(PdfRasterBase(width, height, true, bytes).asImage(), |
| 191 | orientation: orientation, dpi: dpi); | 191 | orientation: orientation, dpi: dpi); |
| 192 | } | 192 | } |
| @@ -3,7 +3,7 @@ description: A pdf producer for Dart. It can create pdf files for both web or fl | @@ -3,7 +3,7 @@ description: A pdf producer for Dart. It can create pdf files for both web or fl | ||
| 3 | homepage: https://github.com/DavBfr/dart_pdf/tree/master/pdf | 3 | homepage: https://github.com/DavBfr/dart_pdf/tree/master/pdf |
| 4 | repository: https://github.com/DavBfr/dart_pdf | 4 | repository: https://github.com/DavBfr/dart_pdf |
| 5 | issue_tracker: https://github.com/DavBfr/dart_pdf/issues | 5 | issue_tracker: https://github.com/DavBfr/dart_pdf/issues |
| 6 | -version: 3.8.5 | 6 | +version: 3.9.0 |
| 7 | 7 | ||
| 8 | environment: | 8 | environment: |
| 9 | sdk: ">=2.12.0 <3.0.0" | 9 | sdk: ">=2.12.0 <3.0.0" |
| @@ -11,9 +11,9 @@ environment: | @@ -11,9 +11,9 @@ environment: | ||
| 11 | dependencies: | 11 | dependencies: |
| 12 | archive: ^3.1.0 | 12 | archive: ^3.1.0 |
| 13 | barcode: ">=2.2.3 <3.0.0" | 13 | barcode: ">=2.2.3 <3.0.0" |
| 14 | - bidi: ^2.0.2 | 14 | + bidi: ^2.0.2 |
| 15 | crypto: ^3.0.0 | 15 | crypto: ^3.0.0 |
| 16 | - image: ">=3.0.1 <4.0.0" | 16 | + image: ^4.0.0 |
| 17 | meta: ">=1.3.0 <2.0.0" | 17 | meta: ">=1.3.0 <2.0.0" |
| 18 | path_parsing: ">=0.2.0 <2.0.0" | 18 | path_parsing: ">=0.2.0 <2.0.0" |
| 19 | vector_math: ^2.1.0 | 19 | vector_math: ^2.1.0 |
| @@ -179,7 +179,7 @@ void main() { | @@ -179,7 +179,7 @@ void main() { | ||
| 179 | )); | 179 | )); |
| 180 | }); | 180 | }); |
| 181 | 181 | ||
| 182 | - test('Container Widgets BoxShadow', () { | 182 | + test('Container Widgets BoxShadow Rectangle', () { |
| 183 | pdf.addPage(Page( | 183 | pdf.addPage(Page( |
| 184 | build: (Context context) => Container( | 184 | build: (Context context) => Container( |
| 185 | margin: const EdgeInsets.all(30), | 185 | margin: const EdgeInsets.all(30), |
| @@ -200,6 +200,28 @@ void main() { | @@ -200,6 +200,28 @@ void main() { | ||
| 200 | )); | 200 | )); |
| 201 | }); | 201 | }); |
| 202 | 202 | ||
| 203 | + test('Container Widgets BoxShadow Ellipse', () { | ||
| 204 | + pdf.addPage(Page( | ||
| 205 | + build: (Context context) => Container( | ||
| 206 | + margin: const EdgeInsets.all(30), | ||
| 207 | + padding: const EdgeInsets.all(20), | ||
| 208 | + decoration: const BoxDecoration( | ||
| 209 | + shape: BoxShape.circle, | ||
| 210 | + boxShadow: <BoxShadow>[ | ||
| 211 | + BoxShadow( | ||
| 212 | + blurRadius: 4, | ||
| 213 | + spreadRadius: 10, | ||
| 214 | + offset: PdfPoint(2, 2), | ||
| 215 | + ), | ||
| 216 | + ], | ||
| 217 | + color: PdfColors.blue, | ||
| 218 | + ), | ||
| 219 | + width: 200, | ||
| 220 | + height: 200, | ||
| 221 | + ), | ||
| 222 | + )); | ||
| 223 | + }); | ||
| 224 | + | ||
| 203 | tearDownAll(() async { | 225 | tearDownAll(() async { |
| 204 | final file = File('widgets-container.pdf'); | 226 | final file = File('widgets-container.pdf'); |
| 205 | await file.writeAsBytes(await pdf.save()); | 227 | await file.writeAsBytes(await pdf.save()); |
| @@ -4,6 +4,7 @@ | @@ -4,6 +4,7 @@ | ||
| 4 | 4 | ||
| 5 | - Remove deprecated Android embedding | 5 | - Remove deprecated Android embedding |
| 6 | - Add custom pages builder to PdfPreview widget [Milad akarie] | 6 | - Add custom pages builder to PdfPreview widget [Milad akarie] |
| 7 | +- Update Image dependency | ||
| 7 | 8 | ||
| 8 | ## 5.9.3 | 9 | ## 5.9.3 |
| 9 | 10 |
| @@ -24,7 +24,6 @@ import 'dart:ui'; | @@ -24,7 +24,6 @@ import 'dart:ui'; | ||
| 24 | 24 | ||
| 25 | import 'package:flutter/foundation.dart'; | 25 | import 'package:flutter/foundation.dart'; |
| 26 | import 'package:flutter_web_plugins/flutter_web_plugins.dart'; | 26 | import 'package:flutter_web_plugins/flutter_web_plugins.dart'; |
| 27 | -import 'package:image/image.dart' as im; | ||
| 28 | import 'package:pdf/pdf.dart'; | 27 | import 'package:pdf/pdf.dart'; |
| 29 | 28 | ||
| 30 | import 'src/callback.dart'; | 29 | import 'src/callback.dart'; |
| @@ -358,11 +357,7 @@ class _WebPdfRaster extends PdfRaster { | @@ -358,11 +357,7 @@ class _WebPdfRaster extends PdfRaster { | ||
| 358 | 357 | ||
| 359 | @override | 358 | @override |
| 360 | Uint8List get pixels { | 359 | Uint8List get pixels { |
| 361 | - if (_pixels == null) { | ||
| 362 | - final img = im.PngDecoder().decodeImage(png)!; | ||
| 363 | - _pixels = img.data.buffer.asUint8List(); | ||
| 364 | - } | ||
| 365 | - | 360 | + _pixels ??= PdfRasterBase.fromPng(png).pixels; |
| 366 | return _pixels!; | 361 | return _pixels!; |
| 367 | } | 362 | } |
| 368 | 363 |
| @@ -19,28 +19,16 @@ import 'dart:typed_data'; | @@ -19,28 +19,16 @@ import 'dart:typed_data'; | ||
| 19 | import 'dart:ui' as ui; | 19 | import 'dart:ui' as ui; |
| 20 | 20 | ||
| 21 | import 'package:flutter/painting.dart'; | 21 | import 'package:flutter/painting.dart'; |
| 22 | -import 'package:image/image.dart' as im; | 22 | +import 'package:pdf/pdf.dart'; |
| 23 | 23 | ||
| 24 | /// Represents a bitmap image | 24 | /// Represents a bitmap image |
| 25 | -class PdfRaster { | 25 | +class PdfRaster extends PdfRasterBase { |
| 26 | /// Create a bitmap image | 26 | /// Create a bitmap image |
| 27 | - const PdfRaster( | ||
| 28 | - this.width, | ||
| 29 | - this.height, | ||
| 30 | - this.pixels, | ||
| 31 | - ); | ||
| 32 | - | ||
| 33 | - /// The width of the image | ||
| 34 | - final int width; | ||
| 35 | - | ||
| 36 | - /// The height of the image | ||
| 37 | - final int height; | ||
| 38 | - | ||
| 39 | - /// The raw RGBA pixels of the image | ||
| 40 | - final Uint8List pixels; | ||
| 41 | - | ||
| 42 | - @override | ||
| 43 | - String toString() => 'Image ${width}x$height ${width * height * 4} bytes'; | 27 | + PdfRaster( |
| 28 | + int width, | ||
| 29 | + int height, | ||
| 30 | + Uint8List pixels, | ||
| 31 | + ) : super(width, height, true, pixels); | ||
| 44 | 32 | ||
| 45 | /// Decode RGBA raw image to dart:ui Image | 33 | /// Decode RGBA raw image to dart:ui Image |
| 46 | Future<ui.Image> toImage() { | 34 | Future<ui.Image> toImage() { |
| @@ -56,16 +44,12 @@ class PdfRaster { | @@ -56,16 +44,12 @@ class PdfRaster { | ||
| 56 | } | 44 | } |
| 57 | 45 | ||
| 58 | /// Convert to a PNG image | 46 | /// Convert to a PNG image |
| 47 | + @override | ||
| 59 | Future<Uint8List> toPng() async { | 48 | Future<Uint8List> toPng() async { |
| 60 | final image = await toImage(); | 49 | final image = await toImage(); |
| 61 | final data = await image.toByteData(format: ui.ImageByteFormat.png); | 50 | final data = await image.toByteData(format: ui.ImageByteFormat.png); |
| 62 | return data!.buffer.asUint8List(); | 51 | return data!.buffer.asUint8List(); |
| 63 | } | 52 | } |
| 64 | - | ||
| 65 | - /// Returns the image as an [Image] object from the pub:image library | ||
| 66 | - im.Image asImage() { | ||
| 67 | - return im.Image.fromBytes(width, height, pixels); | ||
| 68 | - } | ||
| 69 | } | 53 | } |
| 70 | 54 | ||
| 71 | /// Image provider for a [PdfRaster] | 55 | /// Image provider for a [PdfRaster] |
| @@ -19,10 +19,10 @@ dependencies: | @@ -19,10 +19,10 @@ dependencies: | ||
| 19 | flutter_web_plugins: | 19 | flutter_web_plugins: |
| 20 | sdk: flutter | 20 | sdk: flutter |
| 21 | http: ^0.13.0 | 21 | http: ^0.13.0 |
| 22 | - image: ">=3.0.1 <4.0.0" | 22 | + image: ^4.0.0 |
| 23 | js: ^0.6.3 | 23 | js: ^0.6.3 |
| 24 | meta: ">=1.3.0 <2.0.0" | 24 | meta: ">=1.3.0 <2.0.0" |
| 25 | - pdf: ^3.7.2 | 25 | + pdf: ^3.9.0 |
| 26 | plugin_platform_interface: ^2.0.0 | 26 | plugin_platform_interface: ^2.0.0 |
| 27 | 27 | ||
| 28 | dev_dependencies: | 28 | dev_dependencies: |
No preview for this file type
No preview for this file type
-
Please register or login to post a comment