スポンサーサイト

 --------
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
カテゴリ :スポンサー広告 トラックバック(-) コメント(-)

failed to create bitmap

 2010-10-10
おぉぉ!!みんな見た?すごいよ。すごいよ。
DAIさんのとこで、アイテム画面でのエラーを回避するスクリプトが公開されてるよ!
http://daiambition.blog47.fc2.com/blog-entry-65.html

私も Bitmap の制限をなくしたくて挑戦したこともあったけど、結局。。。

空の画像を作って読み直せばよかったのか。
ファイルの読み込みではサイズ制限が無いのは知ってたけど、
そこまで行き着かなかった。。。


DAIさんは、次の野望へと旅立ったようですので、Bitmap クラスの対応は、代わりに私が。。。

◆◇◆◇◆◇◆◇◆◇


今日、7時ごろから5時ごろまでやってました。
なんか久しぶりに集中してましたね。

DAIさんのスクリプトそのままだと、libpng の警告が表示されてしまうようなので、
1bitの一時ファイルを作成して読み込むというアイデアだけいただいて、
1から構成しなおしてみました。警告はうちだけなのかな?
Bitmap.new(512, 8200) のような大きな画像も作れるようになります。


さて、10時間も何に手間取ったかと申しますと、あれですよ。
勘違いです。それと、警告を読まなかったのが原因です。

最初は、Bitmap Class EX のメソッドをそのまま流用して、
8bitの画像で作ってみたのですが、処理速度のほうに問題がありまして、
ここは、DAIさんみたく1bitで作らないといけないと思ったんです。

PNGの構造は、ほとんど忘れてしまっていたのですが、
画像データの先頭には0を追加しないといけないってことを覚えてたので、
何気なく追加して作ってました。
これが間違いの始まりで、意味を考えることなく追加してたわけですよね。

何度やっても警告が出てうまくいかず、あちこちサイトを回って、
公式の方も英語を翻訳しながら見て、あとから翻訳されたサイトを見つけて、
ショックを受けたりしてたわけですよ。

夕飯を作る時間が迫ってくるなか、大量に表示される警告文に目をやると、
フィルターの値がおかしいみたいなこと書かれてて、「フィルター?!」って。
何気なく追加してた0は、画像データじゃなかった。。。
つまり、この0は 1bit では無いわけですよ!
ずっと、1bit だと思っていた0は実は 1byte で、つまり 8bit なわけです。
だから、最初に試したときは問題なく動作してたわけですね。

そうと分かれば、ちょちょいと式を書き換えて実行!!!
おぉ~>< ほろりときちゃう瞬間ですよ。


そして、おもちゃの兵隊さんが行進しだしたので、
私は意気揚々と夕飯の仕度へと向かうのでした。
めでたし、めでたし。

class << Bitmap
#--------------------------------------------------------------------------
# ○ Bitmap オブジェクトを生成します。
#--------------------------------------------------------------------------

alias _cao_sp_new new unless $!
def new(*args)
if args.size == 2 && args[0] * args[1] > 4194304
return create_large_bitmap(args[0], args[1])
else
return _cao_sp_new(*args)
end
rescue => error
raise error.class, error.message, caller.first
end
#--------------------------------------------------------------------------
# ● 一時ファイルを介して、Bitmap オブジェクトを生成します。
# width : ビットマップの幅
# height : ビットマップの高さ
#--------------------------------------------------------------------------

def create_large_bitmap(width, height)
# 識別
sgnt = "\x89PNG\r\n\x1a\n"
# ヘッダ
ihdr = chunk('IHDR', [width, height, 1, 0, 0, 0, 0].pack('N2C5'))
# 画像データ
data = (1 + (width + (8 - width % 8) % 8) / 8) * height
idat = chunk('IDAT', Zlib::Deflate.deflate("\0" * data))
# 終端
iend = chunk('IEND', "")
# ファイルに書き出す
filename = "tmp"
File.open(filename, 'wb') do |file|
file.write(sgnt)
file.write(ihdr)
file.write(idat)
file.write(iend)
end
# Bitmap オブジェクトを生成
bmp = Bitmap.new(filename)
bmp.clear
File.delete(filename) rescue nil
return bmp
end
#--------------------------------------------------------------------------
# ● チャンクの作成
# name : チャンク名
# data : データ
#--------------------------------------------------------------------------

def chunk(name, data)
return [data.size, name, data, Zlib.crc32(name + data)].pack('NA4A*N')
end
end


ただ、大きい画像だと描画時間もその分掛かっちゃうから、
アイテムを分けたり、所持数を制限したりした方がよさそう。

コメント




 

 ※ コメント内にURLを含めるには、バッククォート(`)をURLの直前に付け加えてください。


管理人のみ閲覧許可 [?]

管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
【2014/03/21 23:12】 | | [編集]
kgcさんのモンスター図鑑が登録数多すぎるとエラーはいてたので、いろいろ探していてこちらのサイト様に漂着。
すばらしいです!!!
【2011/11/06 19:11】 | えたーなりっしゅ | [編集]
トラックバック
トラックバックURL:
http://cacaosoft.blog42.fc2.com/tb.php/466-7531b8be
≪ トップページへこのページの先頭へ  ≫
カレンダー
03 << 2017/04 >> 05
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -

カテゴリー
最近の記事
02/28 お返事
02/14 お返事
01/21 お返事
01/12 更新情報
11/28 お返事

最近のコメント
03/16 お返事
01/21 お返事
11/30 z座標
11/20 z座標
08/03 お返事

タグクラウド

リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。