Beispiel #1
0
            public BasePict(BasePict pict)
            {
                m_pImage    = null;
                m_ImageSize = pict.m_ImageSize;
                m_ImageBit  = pict.m_ImageBit;

                m_pPalette     = null;
                m_PaletteSize  = pict.m_PaletteSize;
                m_PaletteBit   = pict.m_PaletteBit;
                m_PaletteColor = pict.m_PaletteColor;

                m_ImageW = pict.m_ImageW;
                m_ImageH = pict.m_ImageH;
                m_Line   = pict.m_Line;
            }
Beispiel #2
0
            /// <summary>
            /// BMPに変換して出力
            /// </summary>
            /// <param name="fileName">出力ファイル名</param>
            /// <returns>RESULTタイプ</returns>
            public RESULT OutputBMP(string fileName)
            {
                // 独自のBITMAPFILEHEADERとBITMAPINFOHEADERを使って出力します
                // ※Silverlightなどアンセーフを使えない環境用

                // 作成されていない or 読み込まれていない
                if (m_pImage == null || m_ImageSize == 0)
                {
                    return(RESULT.ERROR_IMAGE);
                }

                // パレットありなのに設定されていない
                if (m_PaletteColor != 0 && m_pPalette == null)
                {
                    return(RESULT.ERROR_PALETTE);
                }

                // 配列が変わるのでコピーを作成
                BasePict bmpPict = new BasePict(this);

                try
                {
                    bmpPict.m_pImage = new byte[bmpPict.m_ImageSize];
                    Array.Copy(m_pImage, 0, bmpPict.m_pImage, 0, m_ImageSize);

                    if (bmpPict.m_PaletteColor != 0)
                    {
                        bmpPict.m_pPalette = new byte[bmpPict.m_PaletteSize];
                        Array.Copy(m_pPalette, 0, bmpPict.m_pPalette, 0, m_PaletteSize);
                    }
                }
                catch
                {
                    System.Diagnostics.Debug.WriteLine("出力用のメモリ確保に失敗");
                    return(RESULT.ERROR_MEMORY);
                }

                // 左→右、下→上配列に変換
                if (!bmpPict.ConvertBitType(TGA.LINE.IMAGE_LINE_LRDU))
                {
                    return(RESULT.ERROR_OUTPUT);
                }

                try
                {
                    // BMPヘッダーの作成
                    BITMAPFILEHEADER bmHead = new BITMAPFILEHEADER();
                    BITMAPINFOHEADER bmInfo = new BITMAPINFOHEADER();

                    int paletteSize = bmpPict.m_PaletteColor << 2;
                    bmHead.bfSize    += (UInt32)(bmpPict.m_ImageSize + paletteSize);
                    bmHead.bfOffBits += (UInt32)paletteSize;

                    bmInfo.biWidth    = bmpPict.m_ImageW;
                    bmInfo.biHeight   = bmpPict.m_ImageH;
                    bmInfo.biBitCount = (UInt16)bmpPict.m_ImageBit;

                    // BMP出力
                    using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
                    {
                        using (BinaryWriter bwrite = new BinaryWriter(fs))
                        {
                            // ヘッダー
                            bmHead.WriteHeader(bwrite);
                            bmInfo.WriteHeader(bwrite);

                            // パレット
                            if (bmpPict.m_pPalette != null)
                            {
                                if (bmpPict.m_PaletteBit == 32)
                                {
                                    bwrite.Write(bmpPict.m_pPalette, 0, bmpPict.m_PaletteSize);
                                }
                                else if (bmpPict.m_PaletteBit == 24)
                                {
                                    // αを追加する
                                    int        ofs = 0;
                                    const byte A   = 0xff; // 見た目的に0x00の方がいい?
                                    for (int i = 0; i < bmpPict.m_PaletteColor; i++)
                                    {
                                        bwrite.Write(bmpPict.m_pPalette[ofs++]);
                                        bwrite.Write(bmpPict.m_pPalette[ofs++]);
                                        bwrite.Write(bmpPict.m_pPalette[ofs++]);
                                        bwrite.Write(A);
                                    }
                                }
                                else if (bmpPict.m_PaletteBit == 16)
                                {
                                    int    offset = 0;
                                    byte   r, g, b, a;
                                    UInt16 rgba;

                                    for (int i = 0; i < bmpPict.m_PaletteColor; i++)
                                    {
                                        rgba    = BitConverter.ToUInt16(bmpPict.m_pPalette, offset);
                                        offset += 2;

                                        a = (byte)(MASK.getA1(rgba) * 0xff);
                                        r = (byte)(MASK.getR5(rgba) << 3);
                                        g = (byte)(MASK.getG5(rgba) << 3);
                                        b = (byte)(MASK.getB5(rgba) << 3);

                                        byte[] plt = BitConverter.GetBytes(MASK.getRGBA8888(r, g, b, a));
                                        bwrite.Write(plt[2]);
                                        bwrite.Write(plt[1]);
                                        bwrite.Write(plt[0]);
                                        bwrite.Write(plt[3]);
                                    }
                                }
                                else
                                {
                                    System.Diagnostics.Debug.WriteLine("対応していないビット数のパレット");
                                    return(RESULT.ERROR_PALETTE);
                                }
                            }

                            // イメージ
                            bwrite.Write(bmpPict.m_pImage, 0, bmpPict.m_ImageSize);

                            /*
                             * // 4バイトサイズに調整
                             * UInt32 diffSize = Utility.BOUND((int)bmHead.bfSize, 4) - bmHead.bfSize;
                             * if (0 < diffSize)
                             * {
                             *  byte[] padd = new byte[diffSize];
                             *  bwrite.Write(padd, 0, padd.Length);
                             *  bmHead.bfSize += diffSize;
                             * }
                             */
                        }
                    }
                }
                catch
                {
                    return(RESULT.ERROR_OUTPUT);
                }

                return(RESULT.ERROR_NONE);
            }
Beispiel #3
0
            /// <summary>
            /// Bitmapクラスへの変換
            /// </summary>
            /// <param name="destBmp">保存先</param>
            /// <returns>RESULTタイプ</returns>
            public RESULT ConvertBMP(ref Bitmap destBmp)
            {
                // 作成されていない or 読み込まれていない
                if (m_pImage == null || m_ImageSize == 0)
                {
                    return(RESULT.ERROR_IMAGE);
                }

                // パレットありなのに設定されていない
                if (m_PaletteColor != 0 && m_pPalette == null)
                {
                    return(RESULT.ERROR_PALETTE);
                }

                // ピクセルフォーマットの設定
                PixelFormat pixfmt;

                if (m_PaletteColor != 0)
                {
                    pixfmt = m_PaletteColor == 16 ? PixelFormat.Format4bppIndexed : PixelFormat.Format8bppIndexed;
                }
                else
                {
                    pixfmt = Utility.getPixelFormat(m_ImageBit);
                }

                // 配列が変わるのでコピーを作成
                BasePict bmpPict = new BasePict(this);

                try
                {
                    bmpPict.m_pImage = new byte[bmpPict.m_ImageSize];
                    Array.Copy(m_pImage, 0, bmpPict.m_pImage, 0, m_ImageSize);

                    if (bmpPict.m_PaletteColor != 0)
                    {
                        bmpPict.m_pPalette = new byte[bmpPict.m_PaletteSize];
                        Array.Copy(m_pPalette, 0, bmpPict.m_pPalette, 0, m_PaletteSize);
                    }
                }
                catch
                {
                    System.Diagnostics.Debug.WriteLine("出力用のメモリ確保に失敗");
                    return(RESULT.ERROR_MEMORY);
                }

                // 左→右、下→上配列に変換
                if (!bmpPict.ConvertBitType(TGA.LINE.IMAGE_LINE_LRUD))
                {
                    return(RESULT.ERROR_OUTPUT);
                }

                // BMPに変換
                try
                {
                    Bitmap bmp = new Bitmap(bmpPict.m_ImageW, bmpPict.m_ImageH, pixfmt);

                    // パレットあり?
                    if (bmpPict.m_PaletteColor != 0)
                    {
                        // パレットの設定
                        int          offset = 0;
                        ColorPalette pal    = bmp.Palette;

                        // RGBAが逆っぽい
                        if (bmpPict.m_PaletteBit == 24)
                        {
                            for (int i = 0; i < bmpPict.m_PaletteColor; i++)
                            {
                                pal.Entries[i] = Color.FromArgb(bmpPict.m_pPalette[offset + 2],
                                                                bmpPict.m_pPalette[offset + 1],
                                                                bmpPict.m_pPalette[offset + 0]);
                                offset += 3;
                            }
                        }
                        else if (bmpPict.m_PaletteBit == 32)
                        {
                            for (int i = 0; i < bmpPict.m_PaletteColor; i++)
                            {
                                pal.Entries[i] = Color.FromArgb(bmpPict.m_pPalette[offset + 3],
                                                                bmpPict.m_pPalette[offset + 2],
                                                                bmpPict.m_pPalette[offset + 1],
                                                                bmpPict.m_pPalette[offset + 0]);
                                offset += 4;
                            }
                        }
                        else if (bmpPict.m_PaletteBit == 16)
                        {
                            UInt16 rgba;
                            for (int i = 0; i < bmpPict.m_PaletteColor; i++)
                            {
                                rgba    = BitConverter.ToUInt16(bmpPict.m_pPalette, offset);
                                offset += 2;

                                pal.Entries[i] = Color.FromArgb((MASK.getA1(rgba) * 0xff),
                                                                (MASK.getR5(rgba) << 3),
                                                                (MASK.getG5(rgba) << 3),
                                                                (MASK.getB5(rgba) << 3));
                            }
                        }
                        else
                        {
                            return(RESULT.ERROR_PALETTE);
                        }

                        bmp.Palette = pal;
                    }

                    // イメージの設定
                    // ※LockBitsを使う以外方法がなっそうなのでそれで対応
                    Rectangle  rect    = new Rectangle(0, 0, bmpPict.m_ImageW, bmpPict.m_ImageH);
                    BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.WriteOnly, pixfmt);
                    {
                        IntPtr bmpPtr    = bmpData.Scan0;
                        int    bmpStride = bmpData.Stride;
                        {
#if DEBUG
                            // DEBUG
                            int imageW = bmpPict.m_ImageW * (bmpPict.m_ImageBit >> 3);
                            System.Diagnostics.Debug.Assert((bmpStride == imageW),
                                                            "ConvertBMP:画像幅が一致しない:" + bmpStride + " == " + imageW + "\n");
#endif
                        }
                        System.Runtime.InteropServices.Marshal.Copy(bmpPict.m_pImage, 0, bmpPtr, bmpPict.m_ImageSize);
                    }
                    bmp.UnlockBits(bmpData);

                    // 変換できたインスタンスを渡す
                    destBmp = bmp;
                }
                catch
                {
                    return(RESULT.ERROR_CONVERT);
                }

                return(RESULT.ERROR_NONE);
            }