[R] bmp() shifts the image (Windows XP)

Ben Tupper btupper at bigelow.org
Mon Jan 2 15:41:56 CET 2012


Hi,

On Jan 2, 2012, at 7:00 AM, William Simpson wrote:

> Duncan, I checked out as.raster as you suggested. However, I can't
> find info on how to display and save a raster object. What a raster
> object is eludes me. These were fruitless
> ?as.raster
> ?grDevices
> library(help="grDevices")
> ?windows
> ?savePlot
> 
> x<-as.raster(matrix(runif(n*n),nrow=n))
> 
> How to display x? plot(x) and image(x) don't work.
> How to save the bitmap image x?
> 
> Not sure if I need to scale x to be in range 0-255 before doing as.raster().
> 
> I see that x contains elements like "#676767".
> col2rgb("#676767")
>      [,1]
> red    103
> green  103
> blue   103
> That doesn't help me display and save bitmap images.
> 
> I see there is a package called raster but I'd rather avoid it, given
> my very simple needs. Maybe package pixmap will work, then convert the
> saved images to .bmp (e.g. using Irfanview in batch mode).
> 

I agree that it can be very confusing to navigate the many tricks of working with images in R.  I don't know if this helps in your particular case, but for display purposes, the newish rasterImage() is the way to go.  Raster graphics in R got a big boost with the addition of native raster support - see http://journal.r-project.org/archive/2011-1/RJournal_2011-1_Murrell.pdf  Here's a very simple example...

n <- 50
x <- seq(from = -5, to = 20, length = n)
y <- seq(from = 38, to = 45, length = n)
z <- matrix(runif(n*n, min = 0, max = 1), nrow = n, ncol = n)
plot(x,y, typ = "n")
rasterImage(z, x[1], y[1], x[n], y[n])


For pixel-to-pixel output, you might check out the savemat() function in the package 'squash'.

Cheers,
Ben





> Thanks very much for any help!
> Bill
> 
> 
> On 1/1/12, Duncan Murdoch <murdoch.duncan at gmail.com> wrote:
>> On 12-01-01 9:05 AM, William Simpson wrote:
>>> When using bmp() under Windows XP, I find that the saved image is a
>>> shifted version of the correct image. Try this:
>> 
>> The image() function isn't designed to be able to do pixel-level
>> addressing, so it's not too surprising that some rounding error
>> somewhere leads to this.  You could look through the Windows graphics
>> device code to fix it.
>> 
>> However, if you really need pixel level addressing, you should be using
>> raster objects.  I don't know if someone has written code to output a
>> .bmp file, but it's a very simple format, so it shouldn't be too hard,
>> especially if you only need a limited range of pixel formats (e.g.
>> grayscale).
>> 
>> Duncan Murdoch
>> 
>>> 
>>> n<-5
>>> fn<-"01.bmp"
>>> x<-matrix(runif(n*n),nrow=n)
>>> image(x,col=gray(0:255/255),axes=F,frame.plot=F)
>>> bmp(filename = fn,width = n, height = n, units = "px")
>>> par(mar=c(0,0,0,0),pty="s")
>>> image(x,col=gray(0:255/255),axes=F,frame.plot=F)
>>> dev.off()
>>> 
>>> The image 01.bmp is like this:
>>> 22 23 24 25 w
>>> 32 33 34 35 w
>>> 42 43 44 45 w
>>> 52 53 54 55 w
>>> w w w w w w
>>> Where 22 represents x[2,2], etc; w represents a white pixel.
>>> 
>>> For my application, the image has to be .bmp format. The same shifting
>>> behaviour is seen for large values of n. It is not just due to the
>>> small n value.
>>> 
>>> For my application, this shifting is important and has to be
>>> eliminated. Please help.
>>> 
>>> On an unrelated note, I found out that the bmp() code is "smart"
>>> enough to write my image as 8-bit using a palette instead of 24-bit
>>> with 0:255 grey levels if the image being saved does not use all 256
>>> grey levels. I would love to hear it if somebody knows a good way to
>>> make bmp() stupid and always save as 24-bit. My kludge, using 256x256
>>> pixel images, is to tack on an extra row with grey levels 0:255. Then
>>> when displaying, I have to crop the image to get rid of that bogus
>>> row.
>>> 
>>> Thanks very much for any help!
>>> Bill
>>> 
>>> ______________________________________________
>>> R-help at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide
>>> http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>> 
>> 
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

Ben Tupper
Bigelow Laboratory for Ocean Sciences
180 McKown Point Rd. P.O. Box 475
West Boothbay Harbor, Maine   04575-0475 
http://www.bigelow.org



More information about the R-help mailing list