Graphics.drawImage NullPointerException with good image J2ME - java-me

Display display = null;
String url = "http://188.2.222.253/screenshot.png";
DataInputStream is = null;
Image img= null;
try
{
HttpConnection c = (HttpConnection) Connector.open(url);
int len = (int)c.getLength();
if (len > 0)
{
is = c.openDataInputStream();
byte[] data = new byte[len];
is.readFully(data);
img = Image.createImage(data, 0, len);
Form f = new Form("Image");
GameCanvas gc = null;
Graphics g = null;
g.drawImage(img, 0, 0, 0); //NullPointerException
gc.paint(g);
display.setCurrent(gc);
}
else
{
showAlert("length is null");
}
is.close();
c.close();
}
catch (Exception e)
{
e.printStackTrace();
showAlert(e.getMessage());
}
g.drawImage(img, 0, 0, 0) throws NullPointerException. That means that img is null (http://docs.oracle.com/javame/config/cldc/ref-impl/midp2.0/jsr118/javax/microedition/lcdui/Graphics.html). I can use img with ImageItem and its NOT null. What is problem?

You are setting Graphics g = null just before you call g.drawImage(img, 0, 0, 0). It is not your img that is null. It is your Graphics object.
You're also setting GameCanvas gc = null 3 lines before you call gc.paint(g) - another NullPointerException.
On top of this, you can't create and draw on a GameCanvas using this approach. GameCanvas is an abstract class. So you need to create your own class which extends GameCanvas - if a GameCanvas is what you want. I'm not sure that's the case either, since you can easily settle for a Form, if all you want is to display a picture.
Try this instead:
img = Image.createImage(data, 0, len);
Form f = new Form("Image");
f.append(img);
display.setCurrent(f);

Related

Index out of range exception while reading pixel data

Related post: Stride of the BitmapData is different than the original
dimension.
I have taken the source code from here and modified it.
The code is generating a variety of exceptions in different occasions.
.
Error in BitmapLocker.cs
At the following line in Lock(),
// Copy data from IntegerPointer to _imageData
Marshal.Copy(IntegerPointer, _imageData, 0, _imageData.Length);
The following exception is being generated:
An unhandled exception of type 'System.AccessViolationException'
occurred in mscorlib.dll
Additional information: Attempted to read or write protected memory.
This is often an indication that other memory is corrupt.
For the following driver code,
double[,] mask = new double[,]
{
{ .11, .11, .11, },
{ .11, .11, .11, },
{ .11, .11, .11, },
};
Bitmap bitmap = ImageDataConverter.ToBitmap(mask);
BitmapLocker locker = new BitmapLocker(bitmap);
locker.Lock();
for (int i = 0; i < bitmap.Width; i++)
{
for (int j = 0; j < bitmap.Height; j++)
{
Color c = locker.GetPixel(i, j);
locker.SetPixel(i, j, c);
}
}
locker.Unlock();
At the following line in GetPixel(),
if (i > dataLength)
{
throw new IndexOutOfRangeException();
}
An unhandled exception of type 'System.IndexOutOfRangeException'
occurred in Simple.ImageProcessing.Framework.dll
Additional information: Index was outside the bounds of the array.
.
At the following line in SetPixel(),
if (ColorDepth == 8)
{
_imageData[i] = color.B;
}
An unhandled exception of type 'System.Exception' occurred in
Simple.ImageProcessing.Framework.dll
Additional information: (0, 0), 262144, Index was outside the bounds
of the array., i=262144
.
Error in Driver program
At the line,
Color c = bmp.GetPixel(i, j);
An unhandled exception of type 'System.InvalidOperationException'
occurred in System.Drawing.dll
Additional information: Bitmap region is already locked.
Source Code:
public class BitmapLocker : IDisposable
{
//private properties
Bitmap _bitmap = null;
bool _isLocked = false;
BitmapData _bitmapData = null;
private byte[] _imageData = null;
//public properties
public IntPtr IntegerPointer { get; private set; }
public int Width { get { return _bitmap.Width; } }
public int Height { get { return _bitmap.Height; } }
public int Stride { get { return _bitmapData.Stride; } }
public int ColorDepth { get { return Bitmap.GetPixelFormatSize(_bitmap.PixelFormat); } }
public int Channels { get { return ColorDepth / 8; } }
public int PaddingOffset { get { return _bitmapData.Stride - (_bitmap.Width * Channels); } }
public PixelFormat ImagePixelFormat { get { return _bitmap.PixelFormat; } }
public bool IsGrayscale { get { return Grayscale.IsGrayscale(_bitmap); } }
//Constructor
public BitmapLocker(Bitmap source)
{
IntegerPointer = IntPtr.Zero;
this._bitmap = source;
}
/// Lock bitmap
public void Lock()
{
if (_isLocked == false)
{
try
{
// Lock bitmap (so that no movement of data by .NET framework) and return bitmap data
_bitmapData = _bitmap.LockBits(
new Rectangle(0, 0, _bitmap.Width, _bitmap.Height),
ImageLockMode.ReadWrite,
_bitmap.PixelFormat);
// Create byte array to copy pixel values
int noOfBitsNeededForStorage = _bitmapData.Stride * _bitmapData.Height;
int noOfBytesNeededForStorage = noOfBitsNeededForStorage / 8;
_imageData = new byte[noOfBytesNeededForStorage * ColorDepth];//# of bytes needed for storage
IntegerPointer = _bitmapData.Scan0;
// Copy data from IntegerPointer to _imageData
Marshal.Copy(IntegerPointer, _imageData, 0, _imageData.Length);
_isLocked = true;
}
catch (Exception)
{
throw;
}
}
else
{
throw new Exception("Bitmap is already locked.");
}
}
/// Unlock bitmap
public void Unlock()
{
if (_isLocked == true)
{
try
{
// Copy data from _imageData to IntegerPointer
Marshal.Copy(_imageData, 0, IntegerPointer, _imageData.Length);
// Unlock bitmap data
_bitmap.UnlockBits(_bitmapData);
_isLocked = false;
}
catch (Exception)
{
throw;
}
}
else
{
throw new Exception("Bitmap is not locked.");
}
}
public Color GetPixel(int x, int y)
{
Color clr = Color.Empty;
// Get color components count
int channels = ColorDepth / 8;
// Get start index of the specified pixel
int i = (Height - y - 1) * Stride + x * channels;
int dataLength = _imageData.Length - channels;
if (i > dataLength)
{
throw new IndexOutOfRangeException();
}
if (ColorDepth == 32) // For 32 bpp get Red, Green, Blue and Alpha
{
byte b = _imageData[i];
byte g = _imageData[i + 1];
byte r = _imageData[i + 2];
byte a = _imageData[i + 3]; // a
clr = Color.FromArgb(a, r, g, b);
}
if (ColorDepth == 24) // For 24 bpp get Red, Green and Blue
{
byte b = _imageData[i];
byte g = _imageData[i + 1];
byte r = _imageData[i + 2];
clr = Color.FromArgb(r, g, b);
}
if (ColorDepth == 8)
// For 8 bpp get color value (Red, Green and Blue values are the same)
{
byte c = _imageData[i];
clr = Color.FromArgb(c, c, c);
}
return clr;
}
public void SetPixel(int x, int y, Color color)
{
// Get color components count
int cCount = ColorDepth / 8;
// Get start index of the specified pixel
int i = ((Height - y -1) * Stride + x * cCount);
try
{
if (ColorDepth == 32) // For 32 bpp set Red, Green, Blue and Alpha
{
_imageData[i] = color.B;
_imageData[i + 1] = color.G;
_imageData[i + 2] = color.R;
_imageData[i + 3] = color.A;
}
if (ColorDepth == 24) // For 24 bpp set Red, Green and Blue
{
_imageData[i] = color.B;
_imageData[i + 1] = color.G;
_imageData[i + 2] = color.R;
}
if (ColorDepth == 8)
// For 8 bpp set color value (Red, Green and Blue values are the same)
{
_imageData[i] = color.B;
}
}
catch(Exception ex)
{
throw new Exception("("+x+", "+y+"), "+_imageData.Length+", "+ ex.Message+", i=" + i);
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// free managed resources
_bitmap = null;
_bitmapData = null;_imageData = null;IntegerPointer = IntPtr.Zero;
}
// free native resources if there are any.
//private properties
//public properties
}
}
.
ImageDataConverter.cs
public static Bitmap ToBitmap(double[,] input)
{
int width = input.GetLength(0);
int height = input.GetLength(1);
Bitmap output = Grayscale.CreateGrayscaleImage(width, height);
BitmapData data = output.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.WriteOnly,
output.PixelFormat);
int pixelSize = System.Drawing.Image.GetPixelFormatSize(PixelFormat.Format8bppIndexed) / 8;
int offset = data.Stride - width * pixelSize;
double Min = 0.0;
double Max = 255.0;
unsafe
{
byte* address = (byte*)data.Scan0.ToPointer();
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
double v = 255 * (input[x, y] - Min) / (Max - Min);
byte value = unchecked((byte)v);
for (int c = 0; c < pixelSize; c++, address++)
{
*address = value;
}
}
address += offset;
}
}
output.UnlockBits(data);
return output;
}
Here is the picture I used for the test,
int noOfBitsNeededForStorage = _bitmapData.Stride * _bitmapData.Height;
That is the most essential bug in the code. Stride * Height are the number of bytes needed for storage. So it doesn't make the _imageData array large enough and IndexOutOfRangeException is the expected outcome.
int pixelSize = System.Drawing.Image.GetPixelFormatSize(PixelFormat.Format8bppIndexed) / 8;
Lots of possible mishaps from this statement. It hard-codes the pixel format to 8bpp but that is not the actual pixel format that the LockBits() call used. Which was output.PixelFormat. Notably fatal on the sample image, although it is not clear how it is used in the code, 8bpp is a very awkward pixel format since it requires a palette. The PNG codec will create a 32bpp image in memory, even though the original file uses 8bpp. You must use output.PixelFormat here to get a match with the locked data and adjust the pixel writing code accordingly. Not clear why it is being used at all, the SetPixel() method provided by the library code should already be good enough.
int dataLength = _imageData.Length - channels;
Unclear what that statement tries to do, subtracting the number of channels is not a sensible operation. It will generate a spurious IndexOutOfRangeException. There is no obvious reason to help, the CLR already provides array index checking on the _imageData array. So just delete that code.
Additional information: Bitmap region is already locked.
Exception handling in the code is not confident, a possible reason for this exception. In general it must be noted that the underlying bitmap is completely inaccessible, other than through _imageData, after the Lock() method was called and Unlock() wasn't called yet. Best way to do this is with try/finally with the Unlock() call in the finally block so you can always be sure that the bitmap doesn't remain locked by accident.
byte c = _imageData[i];
This is not correct, except in the corner case of an 8bpp image that has a palette that was explicitly created to handle grayscale images. The default palette for an 8bpp image does not qualify that requirement nor is it something you can blindly rely on when loading images from a file. Indexed pixel formats where a dreadful hack that was necessary in the early 1990s because video adapters where not yet powerful enough. It no longer makes any sense at all today. Note that SetPixel() also doesn't handle a 16-bit pixel formats. And that the PNG codec will never create an 8bpp memory image and cannot encode an 8bpp file. Best advice is to eliminate 8bpp support completely to arrive at more reliable code.
In fact, the point of directly accessing pixel data is to make image manipulation fast. There is only one pixel format that consistently produces fast code, it is Format32bppArgb. The pixels can now be accessed with an int* instead of a byte*, moving pixels ~4 times faster. And no special tweaks are necessary to deal with stride or special-case the code for methods like SetPixel(). So pass that format into LockBits(), the codec will do the work necessary if the actual image format is not 32bpp as well.
I should note that Format32bppPArgb is the fast pixel format for displaying images on the screen since it is compatible with the pixel format used by all modern video adapters. But that isn't the point of this code and dealing with the pre-multiplied alpha is awkward.

Issue with Photometric Interpretation tag even after inverting the image data

Note: Giving the background of my previous question once again so as to find all the related stuff at one source.
I'm capturing an image from an android mobile device and it’s in JPEG format. The image is of 72X72DPI and 24 bit. When I try to convert this JPEG image to TIFF using LibTiff.Net and to set the tag Photometric Interpretation = 0 for MinIsWhite, the image turns negative (the white becomes black and black becomes white). The environment is Windows 8.1 64 bit, Visual Studio 2012. The tag must have value 0, where 0 = white is zero.
I absolutely must use Photometric.MINISWHITE in images so tried inverting image data before writing it to TIFF as per the below code. But then the compression changes to LZW instead of CCITT4,Photometric is changed to MINISBLACK from MINISWHITE, FIllorder tag is removed, PlanarConfig tag is removed, New tag Predictor is added with value 1 and the image turns negative again.
public partial class Form1 : Form
{
private const TiffTag TIFFTAG_ASCIITAG = (TiffTag)666;
private const TiffTag TIFFTAG_LONGTAG = (TiffTag)667;
private const TiffTag TIFFTAG_SHORTTAG = (TiffTag)668;
private const TiffTag TIFFTAG_RATIONALTAG = (TiffTag)669;
private const TiffTag TIFFTAG_FLOATTAG = (TiffTag)670;
private const TiffTag TIFFTAG_DOUBLETAG = (TiffTag)671;
private const TiffTag TIFFTAG_BYTETAG = (TiffTag)672;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
using (Bitmap bmp = new Bitmap(#"D:\Projects\ITests\images\IMG_2.jpg"))
{
// convert jpg image to tiff
byte[] tiffBytes = GetTiffImageBytes(bmp, false);
File.WriteAllBytes(#"D:\Projects\ITests\images\output.tif", tiffBytes);
//Invert the tiff image
Bitmap bmpTiff = new Bitmap(#"D:\Projects\ITests\images\output.tif");
Bitmap FBitmap = Transform(bmpTiff);
FBitmap.Save(#"D:\Projects\ITests\images\invOutput1.tif");
}
}
public static byte[] GetTiffImageBytes(Bitmap img, bool byScanlines)
{
try
{
byte[] raster = GetImageRasterBytes(img);
using (MemoryStream ms = new MemoryStream())
{
using (Tiff tif = Tiff.ClientOpen("InMemory", "w", ms, new TiffStream()))
{
if (tif == null)
return null;
tif.SetField(TiffTag.IMAGEWIDTH, img.Width);
tif.SetField(TiffTag.IMAGELENGTH, img.Height);
tif.SetField(TiffTag.COMPRESSION, Compression.CCITTFAX4);
tif.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISWHITE);
tif.SetField(TiffTag.ROWSPERSTRIP, img.Height);
tif.SetField(TiffTag.XRESOLUTION, 200);
tif.SetField(TiffTag.YRESOLUTION, 200);
tif.SetField(TiffTag.SUBFILETYPE, 0);
tif.SetField(TiffTag.BITSPERSAMPLE, 1);
tif.SetField(TiffTag.FILLORDER, FillOrder.LSB2MSB);
tif.SetField(TiffTag.ORIENTATION, BitMiracle.LibTiff.Classic.Orientation.TOPLEFT);
tif.SetField(TiffTag.SAMPLESPERPIXEL, 1);
tif.SetField(TiffTag.RESOLUTIONUNIT, ResUnit.INCH);
tif.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG);
int tiffStride = tif.ScanlineSize();
int stride = raster.Length / img.Height;
if (byScanlines)
{
// raster stride MAY be bigger than TIFF stride (due to padding in raster bits)
for (int i = 0, offset = 0; i < img.Height; i++)
{
bool res = tif.WriteScanline(raster, offset, i, 0);
if (!res)
return null;
offset += stride;
}
}
else
{
if (tiffStride < stride)
{
// raster stride is bigger than TIFF stride
// this is due to padding in raster bits
// we need to create correct TIFF strip and write it into TIFF
byte[] stripBits = new byte[tiffStride * img.Height];
for (int i = 0, rasterPos = 0, stripPos = 0; i < img.Height; i++)
{
System.Buffer.BlockCopy(raster, rasterPos, stripBits, stripPos, tiffStride);
rasterPos += stride;
stripPos += tiffStride;
}
// Write the information to the file
int n = tif.WriteEncodedStrip(0, stripBits, stripBits.Length);
if (n <= 0)
return null;
}
else
{
// Write the information to the file
int n = tif.WriteEncodedStrip(0, raster, raster.Length);
if (n <= 0)
return null;
}
}
}
return ms.GetBuffer();
}
}
catch (Exception)
{
return null;
}
}
public static byte[] GetImageRasterBytes(Bitmap img)
{
// Specify full image
Rectangle rect = new Rectangle(0, 0, img.Width, img.Height);
Bitmap bmp = img;
byte[] bits = null;
try
{
// Lock the managed memory
if (img.PixelFormat != PixelFormat.Format1bppIndexed)
bmp = convertToBitonal(img);
BitmapData bmpdata = bmp.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format1bppIndexed);
// Declare an array to hold the bytes of the bitmap.
bits = new byte[bmpdata.Stride * bmpdata.Height];
// Copy the sample values into the array.
Marshal.Copy(bmpdata.Scan0, bits, 0, bits.Length);
// Release managed memory
bmp.UnlockBits(bmpdata);
}
finally
{
if (bmp != img)
bmp.Dispose();
}
return bits;
}
private static Bitmap convertToBitonal(Bitmap original)
{
int sourceStride;
byte[] sourceBuffer = extractBytes(original, out sourceStride);
// Create destination bitmap
Bitmap destination = new Bitmap(original.Width, original.Height,
PixelFormat.Format1bppIndexed);
destination.SetResolution(original.HorizontalResolution, original.VerticalResolution);
// Lock destination bitmap in memory
BitmapData destinationData = destination.LockBits(
new Rectangle(0, 0, destination.Width, destination.Height),
ImageLockMode.WriteOnly, PixelFormat.Format1bppIndexed);
// Create buffer for destination bitmap bits
int imageSize = destinationData.Stride * destinationData.Height;
byte[] destinationBuffer = new byte[imageSize];
int sourceIndex = 0;
int destinationIndex = 0;
int pixelTotal = 0;
byte destinationValue = 0;
int pixelValue = 128;
int height = destination.Height;
int width = destination.Width;
int threshold = 500;
for (int y = 0; y < height; y++)
{
sourceIndex = y * sourceStride;
destinationIndex = y * destinationData.Stride;
destinationValue = 0;
pixelValue = 128;
for (int x = 0; x < width; x++)
{
// Compute pixel brightness (i.e. total of Red, Green, and Blue values)
pixelTotal = sourceBuffer[sourceIndex + 1] + sourceBuffer[sourceIndex + 2] +
sourceBuffer[sourceIndex + 3];
if (pixelTotal > threshold)
destinationValue += (byte)pixelValue;
if (pixelValue == 1)
{
destinationBuffer[destinationIndex] = destinationValue;
destinationIndex++;
destinationValue = 0;
pixelValue = 128;
}
else
{
pixelValue >>= 1;
}
sourceIndex += 4;
}
if (pixelValue != 128)
destinationBuffer[destinationIndex] = destinationValue;
}
Marshal.Copy(destinationBuffer, 0, destinationData.Scan0, imageSize);
destination.UnlockBits(destinationData);
return destination;
}
private static byte[] extractBytes(Bitmap original, out int stride)
{
Bitmap source = null;
try
{
// If original bitmap is not already in 32 BPP, ARGB format, then convert
if (original.PixelFormat != PixelFormat.Format32bppArgb)
{
source = new Bitmap(original.Width, original.Height, PixelFormat.Format32bppArgb);
source.SetResolution(original.HorizontalResolution, original.VerticalResolution);
using (Graphics g = Graphics.FromImage(source))
{
g.DrawImageUnscaled(original, 0, 0);
}
}
else
{
source = original;
}
// Lock source bitmap in memory
BitmapData sourceData = source.LockBits(
new Rectangle(0, 0, source.Width, source.Height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
// Copy image data to binary array
int imageSize = sourceData.Stride * sourceData.Height;
byte[] sourceBuffer = new byte[imageSize];
Marshal.Copy(sourceData.Scan0, sourceBuffer, 0, imageSize);
// Unlock source bitmap
source.UnlockBits(sourceData);
stride = sourceData.Stride;
return sourceBuffer;
}
finally
{
if (source != original)
source.Dispose();
}
}
public Bitmap Transform(Bitmap bitmapImage)
{
var bitmapRead = bitmapImage.LockBits(new Rectangle(0, 0, bitmapImage.Width, bitmapImage.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppPArgb);
var bitmapLength = bitmapRead.Stride * bitmapRead.Height;
var bitmapBGRA = new byte[bitmapLength];
Marshal.Copy(bitmapRead.Scan0, bitmapBGRA, 0, bitmapLength);
bitmapImage.UnlockBits(bitmapRead);
for (int i = 0; i < bitmapLength; i += 4)
{
bitmapBGRA[i] = (byte)(255 - bitmapBGRA[i]);
bitmapBGRA[i + 1] = (byte)(255 - bitmapBGRA[i + 1]);
bitmapBGRA[i + 2] = (byte)(255 - bitmapBGRA[i + 2]);
// [i + 3] = ALPHA.
}
var bitmapWrite = bitmapImage.LockBits(new Rectangle(0, 0, bitmapImage.Width, bitmapImage.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppPArgb);
Marshal.Copy(bitmapBGRA, 0, bitmapWrite.Scan0, bitmapLength);
bitmapImage.UnlockBits(bitmapWrite);
return bitmapImage;
}
}
You should invert image bytes in GetTiffImageBytes method, before writing them to TIFF. Also, the Transform method converts bi-level image to 32bpp one and that is why you get LZW compressed image in the end.
So, add the following code
for (int k = 0; k < raster.Length; k++)
raster[k] = (byte)(~raster[k]);
after byte[] raster = GetImageRasterBytes(img); in GetTiffImageBytes method. This will invert image bytes. And don't use the following code
//Invert the tiff image
Bitmap bmpTiff = new Bitmap(#"D:\Projects\ITests\images\output.tif");
Bitmap FBitmap = Transform(bmpTiff);
FBitmap.Save(#"D:\Projects\ITests\images\invOutput1.tif");

Out of memory error native Image decode Error while loading image to gallery

I am trying to load image from a folder into my application, the code I am using is
FileConnection fc = null;
DataInputStream in = null;
DataOutputStream out = null;
try {
fc = (FileConnection)Connector.open("file:///e:/Images/Abc.jpg");
int length = (int)fc.fileSize();//possible loss of precision may throw error
byte[] data = null;
if (length != -1) {
data = new byte[length];
in = new DataInputStream(fc.openInputStream());
in.readFully(data);
}
else {
int chunkSize = 112;
int index = 0;
int readLength = 0;
in = new DataInputStream(fc.openInputStream());
data = new byte[chunkSize];
do {
if (data.length < index + chunkSize) {
byte[] newData = new byte[index + chunkSize];
System.arraycopy(data, 0, newData, 0, data.length);
data = newData;
}
readLength = in.read(data, index, chunkSize);
index += readLength;
} while (readLength == chunkSize);
length = index;
}
Image image = Image.createImage(data, 0, length);
image = createThumbnail(image);
ImageItem imageItem = new ImageItem(null, image, 0, null);
mForm.append(imageItem);
mForm.setTitle("Done.");
fc = (FileConnection)Connector.open("file:///e:/Images/Abc.jpg");
if(!fc.exists()){
try{
fc.create();
}catch(Exception ce){System.out.print("Create Error: " + ce);}
}
out = new DataOutputStream(fc.openOutputStream());
out.write(data);
}
catch (IOException ioe) {
StringItem stringItem = new StringItem(null, ioe.toString());
mForm.append(stringItem);
mForm.setTitle("Done.");
}
finally {
try {
if (in != null) in.close();
if (fc != null) fc.close();
}
catch (IOException ioe) {}
hope it can be the problem with image I tried to resize the image
private Image createThumbnail(Image image)
{
int sourceWidth = image.getWidth();
int sourceHeight = image.getHeight();
int thumbWidth = 18;
int thumbHeight = 23;
Image thumb = Image.createImage(thumbWidth, thumbHeight);
Graphics g = thumb.getGraphics();
for (int y = 0; y < thumbHeight; y++)
{
for (int x = 0; x < thumbWidth; x++)
{
g.setClip(x, y, 1, 1);
int dx = x * sourceWidth / thumbWidth;
int dy = y * sourceHeight / thumbHeight;
g.drawImage(image, x - dx, y - dy, Graphics.LEFT | Graphics.TOP);
}
}
Image immutableThumb = Image.createImage(thumb);
return immutableThumb;
}
Still it returns an exception out of memmory native image deocde error, Somebody pls help me to sort it out
This may occur becuase of two reason.
Image size: In some phones due to small heap size not device does not load image so try with smaller image size.
Second reason may be image is corrupt so try with another image.

how to convert my base64string to bitmap in windows phone?

I want to convert base64string to bitmap and i m doing below method but its not working.
public static BitmapImage base64image(string s)
{
if (s.Length > 0)
{
byte[] fileBytes = Convert.FromBase64String(s.Trim('\0'));
// byte[] fileBytes = new byte[s.Length * sizeof(char)];
//System.Buffer.BlockCopy(s.ToCharArray(), 0, fileBytes, 0, fileBytes.Length);
using (MemoryStream ms = new MemoryStream(fileBytes, 0, fileBytes.Length))
{
ms.Write(fileBytes, 0, fileBytes.Length);
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(ms);
return bitmapImage;
}
}
else
{
return null;
}
}
my base64 string is
string s="iVBORw0KGgoAAAANSUhEUgAAAE0AAABACAYAAABfl/puAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAH1pJREFUeF7tmwd4VVXW95NQVWyIioiMCljHCmJBEVFERVCs4FhwHMCCAkoNivTeAgFSSCUhkEZI7z03yU3vvSc3vff6e9e5eVUYFcIY5/veeWY/z3rOLeeee/b/rPrfa+v29va66erq3qXz3zFwBHp6eor477giBHQEtIwr+sV/T+ZPAa23u/c/GtpBB62ru4rs0iAKKtQ0NGgEvL7/OAAHFbQeuohJN8bCdwmu8RsIyzhKdnm4gNb8HwXcoILW2dOIbdTfOOA7BeOw2TilfYZjzHIcgozJKYunoiKFltZ6eno7aWqXI93/J8EcVNBq2nNxTP6IkKzN5JR4kdMSxAnbPdw7ez177fYQW2xIQOpekvNcCcu0JDcvlN6u/3vADSpo5U3ZlNR4UNUcTEqVITaqr1m6ez33z9vL3zevIK78IL7p2zgVuhiHmKW4hK8jKNGE+sbiX2lct4DZ2dFJd/f/f6AOCmiNHQVkVDgRVWpGaPYeTqsXcjzkFVYav8Fyw93sMFYx7/1PsHT7mpQGc6Ly92LsPZ/d7k9xxG0RpZpfsp6+vj7y8/KJU8eRnJhCamoqKSkpJCcna48/vVY+z83JJS83n8L8QsrLy6mqqKZapL6ujsbGxgukgabGBtra2ujo6KC9vZ3enn89wg8KaK0dufikfMeJsOkcCXkEY/+ZeMQe4/NdP/Cl+QaMHQOYMftzvtu1nMCi9ZR3+JBYboZ56EJiso5zoWtTJqWOVlNQkE9DfQO1tbWUlpZSUlJykZTK+6KCIoryCikUycjIIC0ljVSR2NgYYmIuFDXxMdEkJSWRlJBCYnyinJdKdloOmWlZ2geTmZVJVlbWz5KZmUleXi6lZaWUlpRSV1v3szUMCmjK1fKqI7CIXIB11NtkFNmSkt/AvFWH2Oa5icVrj3PjpPW8sHgRVpEvEVtujKYtnqraODG/motMs6mpSSYdK1rResVBQkpCJFmno7Nfm5QH8Iu009raIhonGtjQSGVlJWVlZVrJzc0lOzv7V5KRrjyIdO3DiI6O/hm4QQOtnSbK69JobCrX5mbH7HOZ+bUNp+I3suX4Hn7Y4crKzd/xw+l7cE1dSmKtIfXtmb8CpqGhAbVaTXPzpdOUrp4ONPUaWjvatNfo7v3zfJ/iVxMTE7UuQBmDBtqFs2/vaOfjr+15a6MvJ6I/wEK1Vvt1fm4E+kce46jfNLzyllHUFElf38WTVXyRYlqXAy2pJZE3nN9GnavGo9Kdj09/RHp1mtZvdXV2XbGW/tYPenol8+zqoqW5hYT4BFpaWv480FTJuTw5x4kPv0tindlGDrh+Q7VEVpeAMN74dAWGTgcpqAumuadCbuJihzxQ0KKbo5ls8wCvub7GVJepPHL4YXxyfdgZvouP3T8moDiA0LJQVsWtYlPqD+Q15uFd4s3+7H2cr3EhqSmRjMp0alqrySzPoKmzSQykT2veXaJZnQJ8p2Le7R1as4y5QPv/FE3bapbAM2+oWfZZHS+87ccL7xjx6junuf3uQ+iMWMvy7UH/BNUvz3mgoAXU+jPOejwLXRfyuP0UZljPxKrQipkhMxlmPAx9lT7r/NYz9fwU7j13H8cSDPjU5gOeOf0Mz7k9h37Iej6z+ztrJO2ZbzUfTWMZfT19Wl/Y1tJOS2MzzQ1N4gOb0GjKUKlUKGnQn2KejeKLFnyuYvqCYj5YXM/050qYfF8aQ4eHoqNjJbKJidNNSS/q+E0TqpN0ISEhQXvzlxo+pT48bvEYxTXF7EjdxSun5rImeA0TbSbyF8sJfKtexdc+y1kQ9iZPnZ/BhtD1/M38PT4JX8zEMxM5FHuQV61e4W6LSaxTb9BG8I6WDm2gaKirp76mjprqaoneNRQWFhAaGjr40fOnK/pGpvHMPFd2GNTx9ZpinppezoTJcYwY4SGAmYnsYcToPZg5xmoDxj+P6soqbX7W2dl5SdAqW6oIyQyhrb2N6IpofJJ8iCyORD96A6tV32FfdJr3T83jdsvbWRK9BLssO6Yefpy7BbCFgQvFPRTwov2L3HPyHrIasuhq7aKuupba6hqqayqpqqqSsq+CqvIqcjNzCQ4K/nNA6xIMlmwN4qMVp2kQp+nsmMdDj+Rw4xg1uroeTHzYnU++9GD4VTtZ8IUFTd2/dtiVlRXaHOrCSqBPwO3RVqoDj5B1PTXs9d2JZ74nrbTgmefB380+JVITSW1XLXWNdbzoPJvvI7+ns7GdmtpqAUrAklSksrwSTXE5ZUUaSgs1KKlHWHjYnwOapqaVZz6IZvHnJRw26GTx4koeeDCPMTfHiYa5cdtdXsyZF8owvd2MmLAR39iyX2lTYUEhWZlZF33uWezF6/6vsyDoLTakbiC6PgrbSFt8xUQvHDWNNWgaSrX6m1GTRVmzQk1JqGnvpbquRt6XaTWzuaGZCkkfVDmR5FTmUl9VR2VFpQBURmm+VBbFklDnlZGXky8Jbp42+f3TzNPeTc2Ul1R88kUX777fwdPT67lzYoGYZpKAppjnaRFD9PQOcPt92zhgFqiNVBcO5Sazs7Iv+uzHkC2MNh3Ne54L+auJVBypRuzx2oVN6ikcyh1xKXMhoMGfzxw/Y6XPKhKrk/jQ4VOMM4ypaqmko6GDzu5Ozmtc2ei9kaKyIppbm2mtb6W1vJ3G0iYq82toKmkhqSiJQ0EHsUuxJScnWyqFLOIkBQoL+xM0TTG0j9c58sobJfxjWTez57Tw8KPt3DIul9Fjw3n4MVdG32IpoJmjN3QPn65wY7OxH7ma6osAUrJzBbgLx/rg9dxhMZ6ldv/gUaspGOQasMpmBZbxljxo81ees5zB+uj1TDN5kpmnX8Q8zpSHj0/hDrMJLPH4DHVONDv99zLZ+F6ed5hJTGoU+733s9n3R0wTTLGOtCEqOxiXZCfMsk/y5J4nWBe4jsycLFKS0gkLDiM+Ln7wzTM6p5UnFrrx0We1/H1JJ7NebOX++9sYdWMGa7ZGUyj1m7l1IaOutxDgtktw2McTrxzCyqvk55tRivW0tDRttPppKJn+P84v4V7re9gZsZuHTB7i/aiFfGD+FjtVPzLRdhIOOQ6Ut5Sz2PwTvgv8Dtt8G54+8Swzg2bx+LmHWC9EwdPmz/KI+8PM9Z6Lc5IDs5xmMfrkTUzze5InjJ9gieeHzDgznbXx63h52wvsDdtDYkY6CbEJhISEkpiQONigdXPYRM3UOYl8urSD9xeJb5vexh1/6eSa63Oxc+ovl/JL4e4HFNB2ivwo8iXvfe0iOWWP9nsFNIXFyM//BbTWjlZ2qfbwgsdLvOo7n7UBa7EoMmet62pMYoxY4LOAuKpYWjqa+djuE172fIUd8Tt41fAVlqd9xXSXZ9F312fGyed5yP5h5gXMY6XzCp4wmso483F8nfAlH9l+yJijt7LUWeiqzPPstN+GY8RZ4pOTRMPi8PHxJjkpeXBBq5Xwv+ircyx4p5o1G3uZ+3oLU6e2M3ZcN7p6hcx4PggTSzWL/iFBYLi9gHWQYVftZeKDB7j/KX2iUvt92E+gKYzGhaOjt526HnHWnRXUd9bT2N5AaU0pmkoNhVWFVCkpgqQqiTmJeKV5E5EeQWB0AL7JvliqLAhLV7HNewfLnZdzPMGQ/e77eN36dT6yW4RLih3b3LYxYt9VnA61xSrFnMUnFmMfaU9iUoLkjIm4u3tICfjLgxyUisArspBpcz1YtboJZ/9G3v2gnUl3d3PTmHZx+pUCUqSIrcgpEcd+0Ebt5/n5Xtw0UZ/tpgE/g6bwZlFRURQVFYnG5ZOTm0NJntBCuSWUFwkrIRGuSPizKkkLlIhXVSrHsmqRKmrK6iW3EvaiSiPFtYbiomKKiguFnyskvSCH9MJMUvNSiM+JIzJPRUxmLLE5sex0387bTq8TlRRBWEoE56PciVBHECdsS7wU6h6eXhTkFg6upq07kM6kZxP5/KtWvlxRzguzOpl4d49EzRZ0h9Sgo5srQCWIBIrm2UnOZiyfH0Tv6hVSVi3l+XdMqWnorwDq6+u1pqCYqcIsxMbFyhNP7H8dE0d8bJxEsziiIqOIjIwkUhVJeJhMVjL20OBQ/H398XT3xNvLm4CAQAIDguToR0RQCKqQCIL9Q4mQY3SYGnW4mpCwEJx8nXCLdiIiOpxYlfyHOoGY6Bgt26LQVM7OTmhK+xkOZfxhTSuvruLNT334YGkxuw+08u7HlZLQ1vGXO/oYPrJDQGpkxMgUpk5TS2DwF+DOCGgn0NU5Ia+3iHzMjeNX4RuRepFJ/tabnm5JcIV1UERhHJqbmlHKttr6ampqpOSpqxYyMlNrUhnp6Zw9c4a9e/fg7+cn5GKmOHPF3BK0YIeGhWoT1qCgIAFWwPULxs/fHz8/XwHch6DAQPmdP76+vpw750zTBVTVHwbNzi+daa854hXSSEdXC5FJFTw/u5prr+llyLAOAaWGu+5JRFPTIn9eJu/dRYxEDqE7bD03jf0Snave46ttdr9bxF8WzQtOKJDkOL+wiGopg1zOuXDwwH4KxMwHMpQqRHkQ7doaVPhBjVQFQlLWSGml+NtB0bSWpirmrVDx8ruRkjAqEbCP8qoaZr1cL6B0ibSKVjVy7XV5fLs+nLcWSYKr66qtQa++/jDfrXYVRjSeXQYOTJ53lNisyoHM7XfP0QYS8Yk5UlEovs3JyYljhoaUS2k0mONf1rT8rEAMNs9m2ixrln3dy487Ojlq2cyKdbXcMaGZkSMbuGVsM0OHtQpIioaFiTiLubrI8QTX32xMSEA/764pb+DOqdv58qsNVBT/EtqvdKI/5Xn52QWUaCo4Y2eDocFhyqXwHszxL4DWSnqkAU5Gs9Ff8x6PvebMB5+3M++NNp56qpM7J3Qwcngnt93Wztw3JBDodgpI1SKFItEi3iJ2Int54/2zmDuk8PFyKa90lzLruZcxN9pIaW6gzPHKV4sUAjFaHU1WRhbFpRpO2Zzi+LFjUoxfvA7xRwG8ItB6ZOEiLvggZw2mEer4vmiKE3tMolm2LpR3FgXx5OxAJk3x5sYJKkbeHMy143zRuT4WnRvC0Rntg841Z9EdJfTQVccYduNORv1lBQ88uYqZr25iyUpjrG0O42IxH0+b+eRLWaOwG1cyFJ8UGhJCWnoqJYUlmJuZYWpqLNS5sLKDOK4AtB5SVSc4fXAKAQ4LSVHb0t2p5C5lsrqTJU0v6ajS4whMiuR8ZAwHzePYZRTD3uPRbDUNYfMpf7aYBXDYIoADJu4Y24fgLVEsKTNK1iojoV34qp5AKtNWcf7EfXie/oD89P78baBD0TQlMmZmZojzL8DE1ARDw4Oy2NMw0EsM6LwBg1YgPszd6CH8bOag8t5Fe3O8UC7JdDXF09eSIrRnuvxhnEiSSLTEhCgRaX5RpEMRxeQEhB4vEXcRoXV6Rbo95TsnuuudaZcF556aU+RH/g03o/F4n1pBVdEvhfLlZtQt/JyXt7d2ya2wqFC0zIRjxw1pamq83E+v6PsBgdbeXIiryUzOG7+E3+m3qM01lUagCLrrfOmu9aWnwVUrvY3nRJzpa3SClnP90mwPTYo4iNjId1bQaEFfgwm9dUb01R4VoI7SWXmUds0ROmRNtLXgRxJcbufciemovLbR1jwwn9Qp+Zu7pycZAlpBXgEnBTRbW1vh0C5NnV8RYnLyZUFTvEps6HG8jO7Cz2oGMT5fCVB2tGi86aiyF1GAshNwTotYiyiAnhSATAScE/TVGQo4ihhrQeqV9U7lSN0BaNgnspu+6q0C3ja6KrbQVrxZQNtMccRMgq2ux9X8dXLTfqGaLzVBWRchPCJEyMM8crOLMTxugbmVHe0dA2d8BwLgZUFra0zA2fRVAk+/TIDVnRTFfSdAWdGqOUFn1TF5LSA1HqW7yoyaPDuykq3Iy7AmN92a8nwz2jQG9NVsF9lET/WPcvwRajfRXHKE0owTZCccJDfxKDmJRyhJ30Vz/ga6Cr+kPuldUlz0OH98AsFucn7zpXOt3k4NFZkHiPd+mSTvt4n13cQpo2XYGi+nrjJGsOhnUgZjXBa03LgjYpaP4Wb1LiE211CT9jlNRcdpK9tDV+Vuuiv2UZa2jxDvo/i4ncTfy5EAf2eC/BwJDTiDOsiQ4uxdYr7f01vztQD2HaVpPxDguh0vV3N8vc5KPehMgK8Lwb7mxARtoSTuGzoy3qDAbwSh1tdy7uRcoaHVv9tU2d1RR3WaPvkBY8lw1SHVSYf4MxMItJhMjOPjJLnNoaP5YmLzj4B3SdB6pLMm1OVb3I89gI/1XFRnRlKb+inNBdtoKZQFCc33lCSux9vNiCApmtNS06UhpZjKaqFuhHFIyqggPimPhJgzaDL1oXoVZSmr8XC3JiQijmwh2MorqtAIQ1FUUE5+TjHquGRUgUcpDHuN4oBRxDvo4G7+NImqc8pa7q9Gr5CU1dkHqIseRUviVVSpplKvvoqmiGHUJ46nt+hRygLvpbPl1y0Q/ypwlwStSfoyXK2X4W/5FMHmdxDnoEuFegYteatpzVtBdfIS/Nz3EJcQJ2VLlSzfN8oKdR+eERl8dsCHv+2O5auDKnxU6eQlnaQ8aTuhvsexdPJm1e5zfLvfg10W4RRV9i/3t7a10NDYJsCnEBu4jRzfG0k9L6CZ3E2g2056/5esvHCyHR1NNGTMoTNzGEXh99OSvxVK76U54QaKAm4g6/wYkpwepaLEX352ZXnf74F6SdAqNLHYGCzE//QLourDSXDUoSD4blrSFtCZ8ykZwYuEHTgr64T1koIojSi9BMYV89ISF740jGHZPh+mfeXCq9LToYqOIiroDMdOOfO8fiAf7VLxt71R3L88iMVbw6mT1WxlKL0TTfVtJKYEk+Y/gVwvHTyMbxO/9oMs4irNfxdPvKO9kdq0l8X0J1Cb9TSl6rfozrudOtVI8txuIs1hFCprHUKdF8oK+uDUoJcErSTPD9Mds/G2eo6QU0NJkadeFHANrckP05z+HmrPxSSoA2lr7ZYb6qJDfO1HW4J59E1j9Hea8sSzrzJj0Wr+utyZQ7aRBAuP9d631kx+/xxrD3kwd84HTJ61gnFvn8XYSRJcZQgmgpu2NyzJayrZApqv2U0EOn1F5QXNfz9pQXeXrCQlzqMr/wY68+4hw2kyidYjSbC+muJz40i0HUfMmTvIiT0hz7Rfo//ouDRo+QEC2hx8rJ4kzHYICeJg87x1qAi7nsaUKcR7vk5MhK906fTPtl1Ae2tXInrj32eYjo7Ulzpcc831PLLSm+O+8YSE+vLWSmuunrZX2hTGCqemw5DhdzJi5gl2nlLSin4tkmVK8rKkL8zjAXLk/3xOjsH/zKcC2sVLe/2T7xINW0dl5DVUqq4j+tTDqExuJcXxRkq9r6JAAkP2ufGyIJz2R7H6+feX0TRfTm5/UTLz5wW0ocSLeeZ561ESPISGhGspDr6dYM9D4swrpWlE6c3owz6ikPFztjJ84gJ0bnmCsc98yEKzRHxTvMhK2MQuw+NM+tSB0Y+8w7Ax9zH0wY+47yt3/BP7AekS4Btb6shMsCDNXXySpw5+5jcRcPYzKspyf3PitRUqsoKmUBJ2K3FB24h2WURByCSoeJC+gsmkn7mTxvJ/nT355z+9JGhlRVFYHFggteYCAq2HSyDQIcdrCKVBQyRCDaFWPYwwl9eJDLYQc9JQL5R1l0Rcq7BSXj4Qz0v7Y/nQLg+n9Hhx7svprZpPdOQy9K3CePt4AjM3BfCGUQhncwpRlFVZN66saqUg8xypvi+Q6T6cNNEUH7MxBLmsEmLxt8hEaVkQBW2vkbb7iDmkRlmTFeeFj+VbuBrfT3rwJ9TmmdDTNXj15yVBq6zMxOL4FwQKoxFoNQq1vY5MQo8i/yGUBenRFD+UqsihJLo/hDrkBBlpGVRopD+1ppb86lKii1MJK/CmOOsbuqtfFJ8yl7bqF0gPeofzwTacjYiVJpZMNE110kpaLYspOWTHGZITME3SjWHk++pqQfM0uZlQD33pJLpUOaUQkNEE+UpgkpYD+7Nn2bJlI/EJSmI7uOOSoLW31eJuvUqe2kx8re5CZTeUJBclGOhREapHg1qPrlQdGuNHkB80gYzAWWSFf01R9DpKI1dRGruM+rzZYm9zoU2iV/s86JxLV81sKpNepEAK88LI7yhRr6Mw+lvyI56nNPRWqiKuRhOsKw9Jl+izSspxDxF+ZpedebIsxnh6ulIvTXhusrhy2EAqDen+Huxx2Yog0nsvrkZKRTCfAMurJIrq4GV6G9GO91MUOIq2RB36MvqlKV5MNu4WWjPG05pzH31VT4nNzZB7VsB6TxzWApHXxJaelJpzIj1542hLu4XGuOuoU19DWdhIMj3HiGY9zLHvJ3POYDjhNjpSfz4npVnyZbOsfGlniIyKplo4fScnRw4cPEBW9sXNNIMB4GVBK8k6JyztK3jZfIKfxUjCZBLH149h9ScPcmjrk3haSLRyfIAMn0lURt1GXezNNCSJpN9BU+4jdBQ9RUfJc7SXvkiH5hVaC5+lJfsxmjPuoypxEgXhdxLjPA5Pq/uxO/EUh79/kR+WTOOI/j0SfEbiY3o13mc+GxCRqLTIK63tmrJyztqfxeCIwa/6Qv4toHV11nH+1Do8zGbjby3R8pQuQVYjOLT+LhZ/8jYrvl3L3p3rMTf4Oz5274n/k4TX/i18bJ7D324mYY6zCTrzqjC9b6JyWUCY86uEnVtIsBCZPrLC7Wj+GScPfsGRgzvZuUe6gbavwWL/VBKcRxFxWge7I/eQGG4r+6kuT3/n5ubJCpLsOSguwcbGBiOjEz93ZA8GWD9d47KappyYlx6M3aEZuJjMwsPkOiLO6KB2GIHd/uv56OO32fzjPuydHPALCJZcLJKIyDjCVWpZpY4Tzj6Z6Ng04qT7Jjk1g9TMHGKVThxVLAGBwXj7BIh4Y+9wln071mF5aCqJ54aIL9PDy3gkbrZLZQH54s6i3wNA6W1TtKygoABrK2thbY9quxkHewwItN7eNoLcd2C8+00hI28nwEJHinc97eQc9t3OF+89z5dL1mNsZCwtBTHkSetASWkVZZV1VEjvanV9C9UNrdS3SQNweyeVUnblFJWQnJHDeTcPdmzdw86Vi4UZvkM0TE/r/L1MdXA8+hA5ya4DmrOyEpUjmlYj/bJKS4PNqVOYmpjKAnLtgH5/JScNCDTlgkrdd9roc07umoLjsbvxF+BCxb+luQ0l1G4U+u+PZ/7t41k06V70X36B82tW4mF6AA/bI2LWh/E7ZSBHA/z2bMZ21YccmjWN1Y9OY9n997HqZXkQJ66Taw0jSgALtNbF6choAjwNpdoY2M4VZTezh7s755xdcJI2gj17d3PC6PjPvf9XAsrlzh0waMqFykszsT4kPmjHI7gcu0GSTh0hJoW7kvIqw2c0rrvGsfrpEXyuM5xVUiKtFdkvclLERMRU5IjIbpEdInseGobHmmtJd7+ZRNchhIsPC7LUwXb/jbg7fCuMxy/7kS43kb7uPpwcHdi0+QfWb1wnPSVfSspxSLudZ7DHFYGm/HlVSRZ2JtIbtnMKTkfHio8bSqBMVJlwlq+SkN5Fyt7HCf94LOde0CNkuvi/Z3WIFomS1zHPDyHl3dHE6Y8n2/0u0vxGiqmLdgn4Pif1sNg1CruTK6mqvvJlN6WNXtkmVC2t7BqNRrtpQmFNBntcMWjKDTTXVeJ2eh+GO17lzGEBzni45Fb9fijcTo84r6vIDL2OZLerKTx/K8Vut1LodgvFrrdSIMesoOuFlh6BSpLXIAHL12IILobDMNt6I45Wy6iorh/seQ7q9QYMmrJPqK21TbizGmFlq6UXNRkrUwOObnsdy50TcD1+FZ4nBTxTXdyNpcgW7QsW3xRhI2YnEnZ6CCop+sNODRGQ5HsLXbzMhgrgepzZdx0mPz6CpdE22ReVJFoizXuybbFdOrH7+i6favQj0sdPu/CURWNFw7ql+ldSlStddL4cwgMCrbuzWzYl1Mqm1DzpF4uTlqQA6QBywtrSgkP7NrPl2/kcWH0/NtvH4HhYWQwZImarJ6IrQOr1i6ly1JXgIGWRkQ5Oh0ZiuWUMh9fezvY1Czi4fws2tqdxdXWX9qdA2Z8Zq93HWS/R8FI77JRNGg2yAVYj3T3KHk2lny0iQvrQpIUqMlJNgjTE5EtUrZTU43IbOi4H1k/fDwi0LrkxZSdHZnYO0TKZAOnjcnBwwPTkSQ4dPsbWzZtZ880nrFo6hw3LHmDHyjs5sno0x/Rv4timsRz74VaO/zCWo+tu4MA3I9nxza2sW/4sK5bNZ8M3C9m+bQcGR42wsLTEWcqfAOkLU8claHtv66QPo0cIzt8bikYpG2kL8otITU4jIlxaRwMC8Pf30+4yUcv9pmdm94PWT/z94TEg0JR/UZ52a0ur9LZWa7dBx8vu3GBpjPOUxdkzZ+0xNbPikIEhe7f/wM7vv2Drmnf5/tv30F+5AP0Vb7Jx1dva95tXL2L3phXs2fEjhseMMLewxt7eQds8FxEaLlt8krUtBXWSXykbJQZqnj1ixj093dpddIpGKfsTFFHe9w7YxAeG54BBu/Byyv7vLtmR1i5b+xoapM9VqJiS4mJyZLKpadnC7+cSm5BKlPSeRUXF/q/EielIv6t8npyaRnp6FgXZ+ZRIkqs8CGVHcafsE1X80YUNdAObxr/3LAW0wacB/r1z+Lf/mwLa4C0I/ttv///NH/4PGV2zXGJJhfQAAAAASUVORK5CYII="
But it gives an exception like "The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters."
How can i solve this problem?
Try this:
public void ConvertThis(string ImageText)
{
if (ImageText.Length > 0)
{
Byte[] bitmapData = new Byte[ImageText.Length];
bitmapData = Convert.FromBase64String(FixBase64ForImage(ImageText));
System.IO.MemoryStream streamBitmap = new System.IO.MemoryStream(bitmapData);
Bitmap bitImage = new Bitmap((Bitmap)Image.FromStream(streamBitmap));
}
}
public string FixBase64ForImage(string Image)
{
System.Text.StringBuilder sbText = new System.Text.StringBuilder(Image,Image.Length);
sbText.Replace("\r\n", String.Empty);
sbText.Replace(" ", String.Empty);
return sbText.ToString();
}
hope it helps :)

Play video in textured quad

Actually I want to play a video in quad textured but the displayed video's color is some kind of depreciated if compared if I draw with the rectangle..
Below is the example taken from mdsn plus abit of modification, can anyone check for me please?
Thanks in advance.
public Game1()
{
graphics = new GraphicsDeviceManager(this);
graphics.PreferredBackBufferWidth = 1920;
graphics.PreferredBackBufferHeight = 1080;
graphics.PreferMultiSampling = false;
graphics.IsFullScreen = false;
// Set the back buffer format to color
graphics.PreferredBackBufferFormat = SurfaceFormat.Color;
Content.RootDirectory = "Content";
}
protected override void Initialize()
{
// TODO: Add your initialization logic here
PresentationParameters pp = GraphicsDevice.PresentationParameters;
pp.MultiSampleCount = 20;
quad = new Quad(Vector3.Zero, Vector3.Backward, Vector3.Up, 1,1);
camera = new Camera(this, new Vector3(0, 0, 1.15f), Vector3.Zero, Vector3.Up);
Components.Add(camera);
base.Initialize();
}
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: use this.Content to load your game content here
video = Content.Load<Video>("1");
player = new VideoPlayer();
player.IsLooped = true;
// Setup our BasicEffect for drawing the quad
World = Matrix.Identity;
quadEffect = new BasicEffect(graphics.GraphicsDevice);
quadEffect.EnableDefaultLighting();
quadEffect.View = camera.view;
quadEffect.Projection = camera.projection;
quadEffect.TextureEnabled = true;
// Create a vertex declaration so we can call
// DrawUserIndexedPrimitives later
quadVertexDecl = new VertexDeclaration(VertexPositionTexture.VertexDeclaration.GetVertexElements());
}
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
// Play the video if it isn't already.
if (player.State != MediaState.Playing)
player.Play(video);
KeyboardState state = Keyboard.GetState();
.....
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black);
// TODO: Add your drawing code here
RasterizerState rs = new RasterizerState();
rs.CullMode = CullMode.None;
GraphicsDevice.RasterizerState = rs;
quadEffect.World = World;
if (player.State == MediaState.Playing)
quadEffect.Texture = player.GetTexture();
foreach (EffectPass pass in quadEffect.CurrentTechnique.Passes)
{
pass.Apply();
GraphicsDevice.SamplerStates[0] = SamplerState.LinearClamp;
GraphicsDevice.DrawUserIndexedPrimitives(
PrimitiveType.TriangleList,
quad.Vertices, 0, 4,
quad.Indices, 0, 2);
}
base.Draw(gameTime);
}
You're using quadEffect.EnableDefaultLighting(); and that will add a light source. You can disable it by setting quadEffect.LightingEnabled = false;

Resources