2010-03-24 57 views
5

Tôi hiện đang sử dụng JPGEncoder từ lib AS3 lõi để mã hóa một bitmap để JPEGnhanh hoặc không đồng bộ JPEG AS3 mã hóa

var enc:JPGEncoder = new JPGEncoder(90); 
var jpg:ByteArray = enc.encode(bitmap); 

Bởi vì bitmap là khá lớn (3000 x 2000) mã hóa mất một chặng đường dài trong khi (khoảng 20 giây), khiến ứng dụng dường như bị đóng băng trong khi mã hóa. Để giải quyết điều này, tôi cần một trong hai:

  • Một bộ mã hóa không đồng bộ để tôi có thể tiếp tục cập nhật màn hình (với một thanh tiến trình hoặc một cái gì đó) trong khi mã hóa
  • Một bộ mã hóa thay thế mà chỉ đơn giản là nhanh hơn

Hoặc là có thể, và làm thế nào tôi có thể làm điều đó?

Trả lời

2

Thiết lập bộ mã hóa không đồng bộ có thể là đặt cược tốt nhất của bạn.

Dưới đây là twoexamples từ Adobe

This example là với actionscript/flex, nhưng ý tưởng tương tự của nó.

+1

Và làm cách nào để thực hiện điều đó? :) JPGEncoder chỉ có một phương thức, "mã hóa". –

+0

Tìm thấy một câu trả lời, xem câu trả lời của tôi. –

+0

Đánh bại tôi với nó :) Tôi đã thêm một vài ví dụ khác nhau để tham khảo. – Jason

1
+0

Bạn không nên sử dụng Alchemy nữa. Đây là một tính năng không được chấp nhận như của Flash Player 11.2. –

+0

Sẽ có phiên bản Alchemy mới cho 11.2+ – forresto

+0

Nhưng mã cũ sẽ không hoạt động trừ khi được biên dịch lại bằng phiên bản mới. –

1

Bạn có thể sử dụng bộ mã hóa thuật giả kim. Nó thực sự nhanh và bạn có thể mã hóa hình ảnh một cách không đồng bộ. Bạn có thể sử dụng lớp này để tóm tắt nó.

public class JPGAlchemyEncoder { 

    private static var alchemyWrapper:Object; 
    private var quality:Number; 

    public function JPGAlchemyEncoder(quality:Number) { 
     this.quality = quality; 
     if (!alchemyWrapper){ 
      var loader:CLibInit = new CLibInit; 
      alchemyWrapper = loader.init(); 
     } 
    } 

    public function encode(bitmapData:BitmapData):ByteArray{ 
     var data: ByteArray = bitmapData.clone().getPixels(bitmapData.rect); 
     data.position = 0; 
     return alchemyWrapper.write_jpeg_file(data, bitmapData.width, bitmapData.height, 3, 2, quality); 
    } 

    public function encodeAsync(bitmapData:BitmapData, completeHandler:Function):void{ 
     var encodedData:ByteArray = new ByteArray(); 
     var data: ByteArray = bitmapData.clone().getPixels(bitmapData.rect); 
     data.position = 0; 
     var encodeComplete:Function = function():void{ 
      completeHandler(encodedData); 
     }; 
     alchemyWrapper.encodeAsync(encodeComplete, data, encodedData, bitmapData.width, bitmapData.height, quality); 
    } 
} 
} 
1

giải mã không đồng bộ hình ảnh png trong chủ đề riêng biệt, được hỗ trợ bởi phiên bản mới ...

var loaderContext:LoaderContext = new LoaderContext(); 
loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD; 

var loader:Loader = new Loader(); 
loader.load(new URLRequest("...png"),loaderContext); 
addChild(loader); 

đó là chính thức.

Các vấn đề liên quan