2016-11-14 3 views
3

私のタイトルで今直面している問題を表現できるかどうかわかりません。 私は詳細を説明します:ピクセル配列を小さくすると8ビットのBMPイメージが生成されないリッチテキストAS3

私はRichEditableTextsからbmpイメージを生成していますが、Bitmapクラスを使用してPixelsとして管理できるDisplayObjectプロパティを取得しています。

その後、私はこの機能があります:最初のイメージは良い生成されている

RichEditableTexts

が、2番目:

/* 
    * Create a 8 bit BMP image as bytearray, with 256 color (grayscale). 
    * 
    */ 
    private static function encode(bitmapData:BitmapData):ByteArray { 
     // bit depth configuration 
     var bytesPerPixel:int = 1; 
     var bitDepth:int = 8; 

     // image/file properties 
     var bmpWidth:int   = bitmapData.width; 
     var bmpHeight:int  = bitmapData.height; 
     var imageBytes:ByteArray = bitmapData.getPixels(bitmapData.rect); 

     /* Image from Preview size */ 
     var imageSize:int = bmpWidth * bmpHeight * bytesPerPixel; 

     /* Image offset */ 
     var imageDataOffset:int = 0x436; 

     /* File size */ 
     var fileSize:int = imageSize + imageDataOffset; 

     // binary BMP data 
     var bmpBytes:ByteArray = new ByteArray(); 
     bmpBytes.endian = Endian.LITTLE_ENDIAN; // byte order 

     // header information 
     bmpBytes.length = fileSize; 
     bmpBytes.writeByte(0x42);    // B     //0 
     bmpBytes.writeByte(0x4D);    // M (BMP identifier) //1 
     bmpBytes.writeInt(fileSize);   // file size   //2 
     bmpBytes.position = 0x0A;    // offset to image data 
     bmpBytes.writeInt(imageDataOffset);      //10 4 Bytes 
     bmpBytes.writeInt(0x28);    // header size   //14 4 Bytes 
     bmpBytes.position = 0x12;    // width, height   
     bmpBytes.writeInt(bmpWidth);        //18 4 Bytes 
     bmpBytes.writeInt(bmpHeight);       //22 4 Bytes 
     bmpBytes.writeShort(1);    // planes (1)  //26 2 Bytes 
     bmpBytes.writeShort(bitDepth);  // color depth  //28 2 Bytes 
     bmpBytes.writeInt(0);    // compression type //30 4 Bytes 
     bmpBytes.writeInt(imageSize);  // image data size //34 4 Bytes 

     bmpBytes.writeInt(0x2E23);   // Horizontal resolution //38 4 Bytes 
     bmpBytes.writeInt(0x2E23);   // Vertical resolution //42 4 Bytes 

     bmpBytes.writeInt(0x100);   // Color in the palette 

     bmpBytes.position = 0x36;    // start of color table 

     /* COLOR TABLE */ 
     var table:uint = 256 * 4; 
     for (var i:uint = 0; i < table; i++) { 
      bmpBytes.writeByte(i); //B 
      bmpBytes.writeByte(i); //G 
      bmpBytes.writeByte(i); //R 
      bmpBytes.writeByte(0); //A 
      /* 
      * Grays are made of equal bytes, for example: #AAAAAA is gray. 
      */ 
     } 

     bmpBytes.position = imageDataOffset; // start of image data... byte 310 // 1078 

     // write pixel bytes in upside-down order 
     // (as per BMP format) 
     var col:int = bmpWidth; 
     var row:int = bmpHeight; 
     var rowLength:int = col * bytesPerPixel; // Bytes per column based on Bit depth 

     // Writing bytes to new image vars 
     var writingOffset:int = 4 - (bitDepth/8); 

     try {    
      // make sure we're starting at the 
      // beginning of the image data 
      imageBytes.position = 0; 

      // Tmp ByteArray to extract 32 bits per pixel 
      var tmpBytes:ByteArray; 

      // bottom row up 
      while (row--) { 
       /* hey += "LINE\n"; */ 

       // from end of file up to imageDataOffset 
       tmpBytes = new ByteArray(); 
       bmpBytes.position = imageDataOffset + (row * rowLength); 

       // read through each column writing 
       // those bits to the image in normal 
       // left to rightorder 
       col = bmpWidth; 
       while (col--) { 
        // Extracting the 32 bits corresponding 
        // to a pixel per getPixels method (always the same). 
        imageBytes.readBytes(tmpBytes, 0, 4); 

        // We just need one BYTE of the 4 that are in this array. 
        tmpBytes.position = 3; 

        // THIS IS THE INDEX ON OUR COLOR TABLE (GRAYSCALE). 
        bmpBytes.writeByte(tmpBytes.readUnsignedByte()); 
       } 
      } 
     } catch(error:Error) { 
      // end of file 
      Alert.show(error.toString(), "I/O BMP ERROR"); 
     } 

     // return BMP file 
     return bmpBytes; 
    } 

はこれらから、私は画像を作っていDisplayObjectの例にあります1つのいいえ...

Windows Explorer

私は原子と二番目を開いた場合、次のようになります。

enter image description here

なぜ? 誰かが私が行方不明のものを見ることができる...これはちょうど...ああ。

は、事前にありがとう:)

+0

あなたが.BMP使用する必要がありますか?私はこの10年ほど前にそれを見つけたことはありません。どうして?そこには 'PNGEncoder'が組み込まれています。 – null

+0

8bit PNGを作る方法はありますか? @null 8ビットのためビットマップを使用していますが、十分なグレースケール情報を持つ超小型イメージです。私はイメージが小さい場合は、印刷するためにftpを介してそれらのイメージをプリンタに送信していますが、それは私のために動作する品質を保つことができます。 – mariomenjr

+0

これは解決ですか?そうでなければ、両方の '.bmp'ファイルへのリンクを提供することができます(内部のバイトをチェックしてコードが間違っている箇所を確認できます)... –

答えて

0

私はそれが必要だったときに私はパディングを追加していなかったことが判明... これは、結果のコードです。

private static function encode(bitmapData:BitmapData):ByteArray { 
     var bytesPerPixel:int = 1; 
     var bitDepth:int  = 8; 

     // image/file properties 
     var bmpWidth:int   = bitmapData.width; 
     var bmpHeight:int  = bitmapData.height; 
     var imageBytes:ByteArray = bitmapData.getPixels(bitmapData.rect); 
     var imageSize:int  = imageBytes.length; 

     // Offsets 
     var imageDataOffset:int = 0x436; 
     var colorTableOffset:int = 0x36; 

     // Pixel array 
     var col:int = bmpWidth; 
     var row:int = bmpHeight; 
     var rowLength:int = col * bytesPerPixel; // 4 bytes per pixel (32 bit) 

     // Padding 
     var mod:int = (rowLength % 4) != 0 ? 4 - (rowLength % 4):0; 
     rowLength += mod; 

     // File size 
     var fileSize:int = imageSize + imageDataOffset + (mod * row); 

     // binary BMP data 
     var bmpBytes:ByteArray = new ByteArray(); 
     bmpBytes.endian  = Endian.LITTLE_ENDIAN; // byte order 

     // header information 
     bmpBytes.length = fileSize; 

     // DIB header (40 bytes version) 
     bmpBytes.writeByte(0x42);    // B 
     bmpBytes.writeByte(0x4D);    // M (BMP identifier) 
     bmpBytes.writeInt(fileSize);  // file size 
     bmpBytes.position = 0x0A;    // offset to image data 
     bmpBytes.writeInt(imageDataOffset); 
     bmpBytes.writeInt(0x28);    // header size 
     bmpBytes.position = 0x12;    // width, height 
     bmpBytes.writeInt(bmpWidth); 
     bmpBytes.writeInt(bmpHeight); 
     bmpBytes.writeShort(1);    // planes (1) 
     bmpBytes.writeShort(bitDepth);  // color depth (32 bit) 
     bmpBytes.writeInt(0);     // compression type 
     bmpBytes.writeInt((imageSize + (mod * row)));   // image data size 

     bmpBytes.writeInt(0x2E23);   // Horizontal resolution 
     bmpBytes.writeInt(0x2E23);   // Vertical resolution 

     bmpBytes.writeInt(0x100);   // Color in the palette 

     bmpBytes.position = colorTableOffset; // start of color table... 

     /* COLOR TABLE */ 
     for (var i:uint = 0; i < 1024; i++) { 
      bmpBytes.writeByte(i); //B 
      bmpBytes.writeByte(i); //G 
      bmpBytes.writeByte(i); //R 
      bmpBytes.writeByte(0); //A 
     } 

     /* Pixel array */ 
     bmpBytes.position = imageDataOffset; // start of image data... 
     var imgBmp:ByteArray; 
     try { 

      // make sure we're starting at the 
      // beginning of the image data 
      imageBytes.position = 0; 

      // bottom row up 
      while (row--) { 
       imgBmp = new ByteArray(); 

       // from end of file up to imageDataOffset 
       bmpBytes.position = imageDataOffset + row*rowLength; 

       // read through each column writing 
       // those bits to the image in normal 
       // left to rightorder 
       col = bmpWidth; 
       while (col--) { 

        imageBytes.readBytes (imgBmp, 0, 4); 
        bmpBytes .writeBytes(imgBmp, 1, 1); 
       } 
       bmpBytes.position += mod; 
      } 
     }catch(error:Error){ 
      // end of file 
      Alert.show(error.toString(), "EOF"); 
     } 

     // return BMP file 
     return bmpBytes; 
    } 

BMP仕様では、行のバイト数が4の倍数でないときはいつも、それを解決するためにパディングを追加する必要があります。あなたが見ることができるように

enter image description here

は、私はこのコードを簡素化していますが、これらの行で見ることができれば:

// Padding 
var mod:int = (rowLength % 4) != 0 ? 4 - (rowLength % 4):0; 
rowLength += mod; 

を、私は実際rowLenghtに応じて、私のrowLenghtを調整しています。 はその後、後で私は書くときに、余分なバイト「のカウントに取る」する必要があります。

bmpBytes.position += mod; 

アップバイト充填:

/* Pixel array */ 
bmpBytes.position = imageDataOffset; // start of image data... 
var imgBmp:ByteArray; 
try { 

    // make sure we're starting at the 
    // beginning of the image data 
    imageBytes.position = 0; 

    // bottom row up 
    while (row--) { 
     imgBmp = new ByteArray(); 

     // from end of file up to imageDataOffset 
     bmpBytes.position = imageDataOffset + row*rowLength; 

     // read through each column writing 
     // those bits to the image in normal 
     // left to rightorder 
     col = bmpWidth; 
     while (col--) { 

      imageBytes.readBytes (imgBmp, 0, 4); 
      bmpBytes .writeBytes(imgBmp, 1, 1); 
     } 
     bmpBytes.position += mod; 
    } 
}catch(error:Error){ 
関連する問題