Puis-je enregistrer (écrire dans un fichier) UIImage
objet en tant que fichier bitmap (extension .bmp) dans le répertoire de documents de l'iPhone?Comment enregistrer une UIImage en tant que BMP?
Merci d'avance.
Puis-je enregistrer (écrire dans un fichier) UIImage
objet en tant que fichier bitmap (extension .bmp) dans le répertoire de documents de l'iPhone?Comment enregistrer une UIImage en tant que BMP?
Merci d'avance.
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.
À 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.
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.
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
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
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
ok. La prochaine fois je m'en occuperai. – Yogini