Re: How to convert image from Format1bppIndexed to Format24bppRgb?

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



Clone is for creating a copy so it stands to reason that the clone of a 1bpp
bitmap will also be a 1bpp bitmap.

To copy a bitmap to another format you have to convert the pixels.

In the case of conversion from any type of image to a 24 or 32 bit image you
just need to create a bitmap of the correct size, obtain a Graphics object
for the new image and draw the old image onto it using DrawImage. In the
case of conversion to any indexed type you need to understand the pixel
format, lock the new image using lockbits and convert the data pixel by
pixel.

--
Bob Powell [MVP]
Visual C#, System.Drawing

Find great Windows Forms articles in Windows Forms Tips and Tricks
http://www.bobpowell.net/tipstricks.htm

Answer those GDI+ questions with the GDI+ FAQ
http://www.bobpowell.net/faqmain.htm

All new articles provide code in C# and VB.NET.
Subscribe to the RSS feeds provided and never miss a new article.





<blackcarrera@xxxxxxxxxxx> wrote in message
news:1114325862.445661.59610@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
> Thanks Bob - one last question for you...
>
> When I use clone() on bitmap bm, the resulting bitmap bm2 is still 1bpp
> even though I've specified that I want it to be 24bpp - also a memory
> problem? Since no error is generated, should I just assume that instead
> of trying to create the 24bpp and generating an "out of memory" error,
> the resulting bm2 just takes on the pixel format of the cloned bm?
>
> 2)
> bm2 = bm.Clone(New
> Rectangle(0,0,bm.Width,bm.Height),PixelFormat.Format24bppRgb)
>
> -> the new bitmap bm2 is Format1bppIndexed, not Format24bppRgb
>
> Thanks again for all your help!!
>
> Bob Powell [MVP] wrote:
>> The size of the image file has no bearing on the amount of memory you
> need
>> to represent that file internally. A JPEG image is compressed and
> when the
>> image is read and turned into a raster the memory requirements are
> well
>> known and fixed. The size of a 1bpp image is 24 times smaller than
> the
>> equivalent 24bpp image in memory.
>>
>> If your file has 10,000 by 10,000 pixels that will require
> 3*10000*10000
>> bytes (300 million bytes). To store an Argb file would be 400 million
> bytes.
>>
>> Given that your system might be using a considerable chunk of the 1
> gig
>> available and the image might require 400 megs as well you're running
> fairly
>> close to the limits.
>>
>> Paging of virtual memory is slow and not really designed for huge
> amounts of
>> memory that images require so that will further restrict the system.
>>
>> You're correct in saying that the code looks fine. If the image were
> smaller
>> it'd work just fine. When the system says you're out of memory
> believe it.
>> It knows.
>>
>> Add a bunch of 1 gb simms and things will be happier.
>>
>> --
>> Bob Powell [MVP]
>> Visual C#, System.Drawing
>>
>> Find great Windows Forms articles in Windows Forms Tips and Tricks
>> http://www.bobpowell.net/tipstricks.htm
>>
>> Answer those GDI+ questions with the GDI+ FAQ
>> http://www.bobpowell.net/faqmain.htm
>>
>> All new articles provide code in C# and VB.NET.
>> Subscribe to the RSS feeds provided and never miss a new article.
>>
>>
>>
>>
>>
>> "JY" <blackcarrera@xxxxxxxxxxx> wrote in message
>> news:bc38f5ee.0504221152.4f7523d@xxxxxxxxxxxxxxxxxxxxx
>> > All of my images that are 24bppRgb are also about 41MB in size,
>> > 10000x10000 pixels are fine when I make calls to FromImage,
> DrawImage,
>> > etc. It's only when I try to convert the 1bpp to 24bppRbg that I
> run
>> > into the problem when I make calls to DrawImage (in the process of
>> > trying to convert pixel formats)...
>> >
>> > I also have 1GB RAM so I don't really think that I'm literally "Out
> of
>> > memory" (how did you calculate that I would need 128MB?)
>> >
>> > Any other ideas? My code looks ok?
>> >
>> > Thanks again for your help!!
>> >
>> >
> -------------------------------------------------------------------------------
>> >
> -------------------------------------------------------------------------------
>> > That suggests to me that it's a bit large then.. If the image was
>> > square
>> > it'd be 6556 pixels on a side. To make a 24 bit per pixel image
> you'd
>> > require 128 megabytes of memory.
>> >
>> > There is a possibility that the resulting image is indeed too large
>> > for the
>> > machine.
>> >
>> > --
>> > Bob Powell [MVP]
>> > Visual C#, System.Drawing
>> >
>> > Find great Windows Forms articles in Windows Forms Tips and Tricks
>> > http://www.bobpowell.net/tipstricks.htm
>> >
>> > Answer those GDI+ questions with the GDI+ FAQ
>> > http://www.bobpowell.net/faqmain.htm
>> >
>> > All new articles provide code in C# and VB.NET.
>> > Subscribe to the RSS feeds provided and never miss a new article.
>> >
>> >
>> >
>> >
>> >
>> > "JY" <blackcarrera@xxxxxxxxxxx> wrote in message
>> > news:bc38f5ee.0504220621.6e05e418@xxxxxxxxxxxxxxxxxxxxx
>> >> Thanks for your response Bob... The 1bpp mage is about 41MB
>> >>
>> >> "Bob Powell [MVP]" <bob@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote in
> message
>> >> news:<uKzQARsRFHA.3560@xxxxxxxxxxxxxxxxxxxx>...
>> >>> How big is the 1bpp image?
>> >>>
>> >>> --
>> >>> Bob Powell [MVP]
>> >>> Visual C#, System.Drawing
>> >>>
>> >>> Find great Windows Forms articles in Windows Forms Tips and
> Tricks
>> >>> http://www.bobpowell.net/tipstricks.htm
>> >>>
>> >>> Answer those GDI+ questions with the GDI+ FAQ
>> >>> http://www.bobpowell.net/faqmain.htm
>> >>>
>> >>> All new articles provide code in C# and VB.NET.
>> >>> Subscribe to the RSS feeds provided and never miss a new article.
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>> "JY" <blackcarrera@xxxxxxxxxxx> wrote in message
>> >>> news:bc38f5ee.0504211045.101b6cc5@xxxxxxxxxxxxxxxxxxxxx
>> >>> > Hi,
>> >>> > I'm trying to convert an image with PixelFormat
> Format1bppIndexed
>> > to
>> >>> > Format24bppRgb. I keep getting the "Out of memory" message.
>> >>> >
>> >>> > Here's what I've tried:(
>> >>> >
>> >>> > (where bm.PixelFormat is Format1bppIndexed)
>> >>> > 1)
>> >>> > bm2 = New Bitmap(bm.Width, bm.Height,
> PixelFormat.Format24bppRgb)
>> >>> > g2 As Graphics = Graphics.FromImage(bm2)
>> >>> > g2.DrawImage(bm, subRect, 0, 0, bm.Width, bm.Height,
>> >>> > GraphicsUnit.Pixel)
>> >>> >
>> >>> > -> get "Out of memory"
>> >>> >
>> >>> > 2)
>> >>> > bm2 = bm.Clone(New Rectangle(0, 0, bm.Width, bm.Height),
>> >>> > PixelFormat.Format24bppRgb)
>> >>> >
>> >>> > -> the new bitmap bm2 is Format1bppIndexed, not Format24bppRgb
>> >>> >
>> >>> > Any ideas? I don't necessarily need the image to be
>> > Format24bppRgb - I
>> >>> > just need to be able to use the function "Graphics.FromImage"
> (so
>> > it
>> >>> > could be Format16bppRgb555, etc). Any help will be greatly
>> >>> > appreciated!!
>


.



Relevant Pages

  • Re: How to convert image from Format1bppIndexed to Format24bppRgb?
    ... //image you just need to create a bitmap of the correct size ... > case of conversion to any indexed type you need to understand the pixel ... > Find great Windows Forms articles in Windows Forms Tips and Tricks ... >>> The size of the image file has no bearing on the amount of memory you ...
    (microsoft.public.dotnet.framework.drawing)
  • Re: mspaint fill option in dgi+
    ... Find great Windows Forms articles in Windows Forms Tips and Tricks ... '/ Fills a bitmap using a non-recursive flood-fill. ... '/ Checks to make sure a pixel is in an image. ... Private Shared Function GetPixel(pos As Point, bmd As BitmapData) As Color ...
    (microsoft.public.dotnet.framework.drawing)
  • Re: Faster GetPixel() type method?
    ... not via GetPixel. ... bitmap look into CreateDIBSectionor GetDIBits. ... Once you get the DI-Bitmap into your own memory, getting a pixel ...
    (microsoft.public.vc.mfc)
  • Re: Faster GetPixel() type method?
    ... not via GetPixel. ... For an in-memory bitmap look into CreateDIBSectionor GetDIBits. ... Once you get the DI-Bitmap into your own memory, getting a pixel becomes an address arithmetic operation. ... For best speed, you really don't want to go through all this addressing for each pixel, so you get the address of the first line of pixels and simply increment a pointer through it processing each pixel. ...
    (microsoft.public.vc.mfc)
  • Re: How to convert image from Format1bppIndexed to Format24bppRgb?
    ... Find great Windows Forms articles in Windows Forms Tips and Tricks ... > //image you just need to create a bitmap of the correct size ... >> case of conversion to any indexed type you need to understand the pixel ...
    (microsoft.public.dotnet.framework.drawing)