[Win32utils-devel] Getting image size for win32-clipboard
Heesob Park
phasis at gmail.com
Sat Apr 18 05:19:52 EDT 2009
Hi,
2009/4/18 Daniel Berger <djberg96 at gmail.com>:
>
> I opened up a small .jpg file with Photoshop Elements 5. I did a
> Ctrl-A + Ctrl-C. This was the result:
>
> Header Size: 40
> Width: 570
> Height: 570
> Planes: 1
> Bit Count: 24
> Compression: 0
> Image Size: 0
> X Per Meter: 112205
> Y Per Meter: 112205
> Color Used: 0
> Color Import: 0
>
> Ok...this is strange. I opened up the *same* image in Paint, and did a
> Ctrl-A + Ctrl-C. This was the result:
>
> Header Size: 40
> Width: 570
> Height: 570
> Planes: 1
> Bit Count: 24
> Compression: 0
> Image Size: 975840
> X Per Meter: 112200
> Y Per Meter: 112200
> Color Used: 0
> Color Import: 0
>
> Maybe because it was a jpg instead of a bmp? I'm not sure.
>
> In any case, I've got the initial implementation in CVS. I am having
> some trouble actually copying clipboard contents. I tried this:
>
> File.open("test.bmp", "wb"){ |fh| fh.write Clipboard.data(Clipboard::DIB) }
>
> The file size is identical, but I can't open the resulting file - MS
> Paint says it doesn't recognize the format.
>
> Please take a look at the code in CVS (and use the latest windows-pr)
> and see if everything looks alright.
>
Here is a patch.
--- clipboard.rb 2009-04-18 18:11:44.000000000 +0900
+++ clipboard.rb.new 2009-04-18 18:12:03.000000000 +0900
@@ -234,6 +234,7 @@
begin
address = GlobalLock(handle)
+ buf_size = GlobalSize(handle)
memcpy(bmi, address, bmi.length)
size = bmi[0,4].unpack('L').first # biSize
@@ -241,6 +242,7 @@
compression = bmi[16,4].unpack('L').first # biCompression
size_image = bmi[20,4].unpack('L').first # biSizeImage
clr_used = bmi[32,4].unpack('L').first # biClrUsed
+ size_image = buf_size+16 if size_image==0
# Calculate the header size
case bit_count
@@ -264,9 +266,10 @@
raise Error, "invalid bit count"
end # case
- buf_size = size + 14 + (table_size * 4) + size_image
+ offset = 0x36 + (table_size*4)
buf = 0.chr * buf_size
memcpy(buf, address, buf.size)
+ buf = "\x42\x4D" + [size_image].pack('L') + 0.chr * 4 +
[offset].pack('L') + buf
ensure
GlobalUnlock(handle)
end
Regards,
Park Heesob
More information about the win32utils-devel
mailing list