2009-08-29 5 views

答えて

0

BMPは圧縮形式ではないので、これは良い考えですか?

おそらく、携帯端末では画像のサイズがさらに重要になります。

2

今はサイズについて心配していません。ちょうど知りたいことは、画像データを.bmpファイルとして書き込むことができることです。

+0

フェア、私はiphoneを持つ人があなたを聞かせすることを願って知っている。 Appleが古いWindowsイメージ形式をサポートしているのかもしれません。わかりません。がんばろう。 – pavium

+0

あなたが答えにコメントしたいならば、それぞれの答えの下に「コメントを追加」リンクがあります。サイトを適切に使用することはそれほど難しいことではなく、すべての人にとってより良いものになります。 – zoul

+0

ok。次回はこれを世話します。 – Yogini

3

私はBMPがiPhoneでサポートされているとは思わない。誰かがBMPに保存するUIImageのカテゴリを書いたのかもしれませんが、私は何も知らないのです。私はあなたがUIImageからビットマップデータを取得し、それらを自分で書く必要があると思う、BMPはかなり単純なファイル形式です。あなたがしなければならないのは、ヘッダーを書き出してから非圧縮のデータを書き出すことだけです。ヘッダーは、BITMAPINFOHEADERと呼ばれる構造です。MSDNを参照してください。 UIImageのビットマップデータを取得することについては、AppleのTechnical Q&A1509に記載されています。

1

これを実現するのは古い投稿ですが、誰かがそれを見つけた場合、私は解決策を探しました。 私は基本的にUIImageを小さなBMPとしてFTPする必要があったので、MonoTouchでこの粗クラスをハッキングしました。 zxing.Bitmap.csExample 1 from wikipedia BMP articleから借りました。それは動作するようです。 AsBMP()などの拡張機能を実行するためには、より滑らかであったかもしれません。十分 (私はObjective-Cの同等があるかわからない、うまくいけば、これは誰かに便利です。)

using System; 
using System.Drawing; 
using System.Runtime.InteropServices; 
using MonoTouch.Foundation; 
using MonoTouch.UIKit; 
using MonoTouch.CoreGraphics; 
public class BitmapFileRGBA8888 
{ 
    public byte[] Data; // data needs to be BGRA 
    public const int PixelDataOffset = 54; 

    public BitmapFileRGBA8888(UIImage image) 
    { 
     CGImage imageRef = image.CGImage; 
     int width = imageRef.Width; 
     int height = imageRef.Height; 
     Initialize((uint)width, (uint)height); 
     CGColorSpace colorSpace = CGColorSpace.CreateDeviceRGB(); 

     IntPtr rawData = Marshal.AllocHGlobal(height*width*4); 
     CGContext context = new CGBitmapContext(
      rawData, width, height, 8, 4*width, colorSpace, CGImageAlphaInfo.PremultipliedLast 
     ); 
     context.DrawImage(new RectangleF(0.0f,0.0f,(float)width,(float)height),imageRef); // RGBA 

     byte[] pixelData = new byte[height*width*4]; 
     Marshal.Copy(rawData,pixelData,0,pixelData.Length); 
     Marshal.FreeHGlobal(rawData); 

     int di = PixelDataOffset; 
     int si; 
     for (int y = 0; y < height; y++) 
     { 
      si = (height-y-1) * 4 * width; 
      for (int x = 0; x < width; x++) 
      { 
       CopyFlipPixel(pixelData, si, Data, di); 
       di += 4; // destination marchs forward 
       si += 4; 
      } 
     } 
    } 

    private void CopyFlipPixel(byte[] Src, int Src_offset, byte[] Dst, int Dst_offset) 
    { 
     int S = Src_offset; 
     int D = Dst_offset + 2; 
     Dst[D--] = Src[S++]; // R 
     Dst[D--] = Src[S++]; // G 
     Dst[D--] = Src[S++]; // B 
     Dst[Dst_offset+3] = Src[S]; // alpha 
    } 

    private void Initialize(uint W, uint H) 
    { 
     uint RawPixelDataSize = W * H * 4; 
     uint Size = RawPixelDataSize + 14 + 40; 
     Data = new byte[Size]; 
     Data[0] = 0x42; Data[1] = 0x4D; // BITMAPFILEHEADER "BM" 
     SetLong(0x2, Size); // file size 
     SetLong(0xA, PixelDataOffset); // offset to pixel data 
     SetLong(0xE, 40); // bytes in DIB header (BITMAPINFOHEADER) 
     SetLong(0x12, W); 
     SetLong(0x16, H); 
     SetShort(0x1A, 1); // 1 plane 
     SetShort(0x1C, 32); // 32 bits 
     SetLong(0x22, RawPixelDataSize); 
     SetLong(0x26, 2835); // h/v pixels per meter device resolution 
     SetLong(0x2A, 2835); 
    } 

    private void SetShort(int Offset, UInt16 V) 
    { 
     var byts = BitConverter.GetBytes(V); 
     if (!BitConverter.IsLittleEndian) Array.Reverse(byts); 
     Array.Copy(byts,0,Data,Offset,byts.Length); 
    } 
    private void SetLong(int Offset, UInt32 V) 
    { 
     var byts = BitConverter.GetBytes(V); 
     if (!BitConverter.IsLittleEndian) Array.Reverse(byts); 
     Array.Copy(byts,0,Data,Offset,byts.Length); 
    } 
} // END CLASS 

基本的に

var Bmp = new BitmapFileRGBA8888(TempImage); 
FTP.UploadBin(Bmp.Data, "test.bmp");  // or just write as binary file 
関連する問題