2009-08-29 10 views

Répondre

0

Puisque BMP n'est pas un format compressé, est-ce une bonne idée?

Vraisemblablement, la taille de l'image est encore plus importante sur les appareils portables.

2

À l'heure actuelle, je ne suis pas préoccupé par la taille. Je veux juste savoir que je peux écrire des données d'image en tant que fichier .bmp.

+0

assez juste, j'espère que quelqu'un avec un iPhone peut vous permettre de connaître. Peut-être que Apple prend en charge les anciens formats d'image Windows - je ne sais pas. Bonne chance. – pavium

+0

Allez les gars - si vous voulez juste commenter une réponse, il y a un lien 'ajouter un commentaire' sous chaque réponse. Utiliser correctement le site n'est pas si difficile et le rend meilleur pour nous tous. – zoul

+0

ok. La prochaine fois je m'en occuperai. – Yogini

3

Je ne pense pas que BMP est pris en charge sur iPhone. Peut-être que quelqu'un a écrit une catégorie pour UIImage qui économise en BMP, mais je n'en sais rien. Je suppose que vous devrez obtenir les données bitmap de la UIImage et les écrire vous-même, BMP est un format de fichier assez simple. Tout ce que vous avez à faire est d'écrire l'en-tête, puis les données non compressées. L'en-tête est une structure appelée BITMAPINFOHEADER, voir MSDN. Obtenir les données bitmap d'un UIImage est décrit dans le Technical Q&A1509 d'Apple.

1

Réaliser ceci est un ancien article, mais au cas où quelqu'un le trouverait comme je cherchais une solution. J'ai fondamentalement besoin de FTP UIImage comme un petit BMP, donc j'ai piraté cette classe brute dans MonoTouch. J'ai emprunté de zxing.Bitmap.cs et Example 1 from wikipedia BMP article. Cela semble fonctionner. Peut-être aurait-il été plus facile de faire une extension comme AsBMP() ou quelque chose comme ça. (Je ne sais pas ce que l'équivalent-objectif c est, mais cela est utile, espérons à quelqu'un.)

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 

Fondamentalement

var Bmp = new BitmapFileRGBA8888(TempImage); 
FTP.UploadBin(Bmp.Data, "test.bmp");  // or just write as binary file 
Questions connexes