mboost-dp1
Targa i C#?
- Forside
- ⟨
- Forum
- ⟨
- Programmering
To sekunder på google giver denne: http://www.codeproject.com/KB/graphics/graphicsuit...
Så vidt jeg husker, så er tga et RAW format.
Du burde derfor blot kunne åbne filen og så bare gå amok.
Betragt følgende funktion:
Den læser en farve fra en "raw unsafe image blob". TGA-formatet har vist nok også en alpha-byte, som du naturligvis skal huske at tage højde for.
PS. BitmapData-komponenten får du på følgende vis:
Du burde derfor blot kunne åbne filen og så bare gå amok.
Betragt følgende funktion:
public unsafe Color Read24bitPixel(int x, int y)
{
byte* p = (byte*)m_bitmapdata.Scan0.ToPointer();
int offset = y * m_bitmapdata.Stride + 3 * x;
return Color.FromArgb((int)p[offset + 2], (int)p[offset + 1], (int)p[offset]);
}
Den læser en farve fra en "raw unsafe image blob". TGA-formatet har vist nok også en alpha-byte, som du naturligvis skal huske at tage højde for.
PS. BitmapData-komponenten får du på følgende vis:
m_bitmapdata = m_bitmap.LockBits(new Rectangle(0, 0, m_bitmap.Size.Width, m_bitmap.Size.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
Hov, glemte at det nok er det modsatte, du har brug for:
Du læser din tga, som du selv har lyst til og så opretter du et .NET Image, som du skriver bytesene til:
Du læser din tga, som du selv har lyst til og så opretter du et .NET Image, som du skriver bytesene til:
public unsafe void Write24bitPixel(int x, int y, Color color)
{
byte* p = (byte*)m_bitmapdata.Scan0.ToPointer();
int offset = y * m_bitmapdata.Stride + 3*x;
p[offset] = color.B;
p[offset + 1] = color.G;
p[offset + 2] = color.R;
}
Tak for de fine svar!
#9 Det lyder faktisk interessant...
Mit problem er, at jeg skal bruge billedet som et objekt af typen Image. Dette er for, at jeg kan vise det i en PictureBox, i en C#-applikation.
Det er muligt, at de ovenstående forslag kan bruges til dette, men jeg er ikke lige i stand til at se det...
DirectX ville selvfølgelig være en mulighed så.
#9 Det lyder faktisk interessant...
Mit problem er, at jeg skal bruge billedet som et objekt af typen Image. Dette er for, at jeg kan vise det i en PictureBox, i en C#-applikation.
Det er muligt, at de ovenstående forslag kan bruges til dette, men jeg er ikke lige i stand til at se det...
DirectX ville selvfølgelig være en mulighed så.
Trident:
DirectX i C# (eller .Net generelt) er en pain in the ass, da MS har valgt at droppe understøttelsen for managed DirectX. Derfor skal du a) finde nogen der har lavet en wrapper for dig b) selv skrive en wrapper. At bruge DirectX til en så simpel opgave er i min verden totalt overkill, og illishars løsning i #8 burde kunne give dig hvad du har brug for, ydermere har jeg succesfuldt brug FreeImage til at indlæse andre billeder med i et tidligere projekt, og kan ikke helt se hvor du får problemer?
DirectX i C# (eller .Net generelt) er en pain in the ass, da MS har valgt at droppe understøttelsen for managed DirectX. Derfor skal du a) finde nogen der har lavet en wrapper for dig b) selv skrive en wrapper. At bruge DirectX til en så simpel opgave er i min verden totalt overkill, og illishars løsning i #8 burde kunne give dig hvad du har brug for, ydermere har jeg succesfuldt brug FreeImage til at indlæse andre billeder med i et tidligere projekt, og kan ikke helt se hvor du får problemer?
DirectX i C# (eller .Net generelt) er en pain in the ass, da MS har valgt at droppe understøttelsen for managed DirectX.
Nej de har ej.
De har bare valgt ikke at fortsætter på det, men at forsøge at få udviklerne til at bruge XNA istedet.
Du kan stadigvæk bruge MDX uden problemer.
Og et eksempel med DirectX, som kan åbne alle billede typer DirectX har support for, inc. tga og ddx.
Og brug:
Nødvendige imports:
using System.IO;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
private Image OpenImage(String filename)
{
byte[] image = File.ReadAllBytes(filename);
Stream stream = new MemoryStream();
stream.Write(image,0,image.Length);
stream.Position = 0;
stream.SetLength(image.Length);
PresentParameters presentParams = new PresentParameters();
presentParams.Windowed = true;
presentParams.SwapEffect = SwapEffect.Discard;
presentParams.AutoDepthStencilFormat = DepthFormat.D16;
presentParams.EnableAutoDepthStencil = true;
Device device = new Device(0,
DeviceType.Hardware,
this.imagePanel,
CreateFlags.SoftwareVertexProcessing,
presentParams
);
BaseTexture texture = TextureLoader.FromStream(device,stream);
GraphicsStream gStream = TextureLoader.SaveToStream(ImageFileFormat.Bmp,texture);
return new Bitmap(gStream);
}
Og brug:
private void TargaPictureBoxForm_Load(object sender, EventArgs e)
{
Image i = OpenImage("flower.tga");
displayPictureBox.Image = i;
}
Nødvendige imports:
using System.IO;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
Og et link til download af hele projektet:
http://web27190.web08.talkactive.net/media/TargaPi...
Og link til Managed DirectX som du skal bruge for at compile:
http://www.microsoft.com/downloads/details.aspx?Fa...
http://web27190.web08.talkactive.net/media/TargaPi...
Og link til Managed DirectX som du skal bruge for at compile:
http://www.microsoft.com/downloads/details.aspx?Fa...
Windcape:
MS har ikke lavet en komplet version af DirectX i managed C# og har medlt ud at de aldrig laver det færdig => droppet understøttelse.
Det er korrekt at de hellere vil have folk over på XNA, da det kan afvikles på XBox360 og Windows.
At det kan lade sig gøre i direct x er ikke ensbetydendemed at det er den rigtige løsning.
MS har ikke lavet en komplet version af DirectX i managed C# og har medlt ud at de aldrig laver det færdig => droppet understøttelse.
Det er korrekt at de hellere vil have folk over på XNA, da det kan afvikles på XBox360 og Windows.
At det kan lade sig gøre i direct x er ikke ensbetydendemed at det er den rigtige løsning.
Gå til top
Opret dig som bruger i dag
Det er gratis, og du binder dig ikke til noget.
Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.