• ベストアンサー

BYTEの配列の扱いについて

すみません、BYTEを初めて利用している者なのですが、 文字列の描画で BYTE* ptr = new BYTE[20480]; と宣言した中に、 GetGlyphOutline() で取得した文字の画像を、1文字ずつ &ptr[0]  &ptr[2000]  &ptr[4000]  &ptr[6000] ・・・ と2000毎に文字を入れ、書き出す時もそうしているのですが、 1文字目はキレイに描画できるのですが、2文字目以降が崩れてしまいます。 変なループが起きたり、文字毎に下に隙間が等倍で増えていく感じです。 これはBYTEの使い方を誤っていて、無理な使い方をしているのでしょうか? また、以前の質問でバイトも配列?が使えると聞いたのですが、 BYTE* ptr = new BYTE[1048 * 10]; これは BYTE* ptr = new BYTE[10480];  これと全く同じ物という意味なのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.2

私はGetGlyphOutline() を使ったことがないので一般論しか言えないのです。 参考になるサイトを見つけましたので報告します。 http://and-so-on.blog.so-net.ne.jp/archive/c45391264-1 GetGlyphOutline() は癖があるらしく、使いこなすのが難しそうです。 >BYTE* ptr = new BYTE[1048 * 10]; これは >BYTE* ptr = new BYTE[10480];  これと全く同じ物という意味なのでしょうか? こちらは確信をもって言えます。 まったく同じです。 ソースの可読性を上げるために私もよくやります BYTE* p = new BYTE[1024 * 1024] これなら一目で1MBytesとわかります BYTE* p = new BYTE[1048576] 計算しないとわからないかもしれません でも2つは全く同じです コンパイルするときに1024 * 1024が計算されるので 実行時の速度低下もありません

zaxs5968
質問者

お礼

情報有難うございます。 BYTEの私の使い方そのものは、そう間違ってはいないのですね。 GetGlyphOutline() の利用方法。変えるなりしてみようと思います。 2つ目は可読性だったのですね。 >実行時の速度低下もありません 便利ですね。 有益な情報を本当にありがとうございました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

GetGlyphOutline は知らないのであてずっぽですが, そこの「2000」の根拠は? 最後の 2つは同じ.

zaxs5968
質問者

お礼

えっと、GetGlyphOutline では画像のサイズを取得してから 再度呼び出して画像を取得するのですが、 17画・16画の漢字と、一やl(エル)等でデータサイズを計測して 十分余裕が有る1500 をさらに余裕を持たせて2000 でした。 説明不足ですいませんでした。 ご回答有難うございます。

関連するQ&A

  • BYTEについて―

    BYTEについて― わからない事がいろいろと有るのですが、 【1.データの受渡しについて。】 LPBYTE型に入っている32bitのBMP画像(pixel)を BYTE*型(pbyte)に代入する場合 pbyte = (BYTE*)pixel; このコードで問題ないのでしょうか? また、用意した受け皿のサイズを超えたデータを入れた場合、 配列の末尾に\0が入って残りは切り捨てられているのでしょうか? そして、これは正常に動作するやり方なのでしょうか? 【2.LPとは?】 LPBYTEはBYTEのポインタ型と聞きますが、 BYTE*とどう用法が違うのでしょうか?(LPシリーズ全般の疑問ですが) また、LPBYTEもやはり、末尾に\0が入って管理されているのでしょうか? 【3.宣言・定義・使い方について。】 現在、 BYTE* pbyte = new BYTE[10240]; 等と書いてBYTE配列を作っているのですが、 これは宣言と同時に定義している事になるのでしょうか? そして、newしている以上、手動でdeleteしなければならないのですよね? また、これ以外の定義方法も有るのでしょうか? 質問が多岐に渡っていてすいません、 どうも普通の配列と混同しているのか、 頭の中で疑問がグルグル回ってしまっていまして; よろしくお願いします。 っ;_ _)っ

  • [VB.net] StringからByte配列への変換

    皆さんこんばんは。 最近VB.NET2000でVisual Basicをはじめたのですが、どうにもString型の値をByte配列へ変換するやり方が分かりません。 VB6.0だとByte配列にStringを代入するだけでいいそうなのですが、.NETで代入しようとすると『型"String"の値を"Byteの1次元配列"に変換できません』というビルドエラーが表れてしまいます。 CByte( Mid(str,i,1) ) CLng( Mid(str,i,1) ) 他にも上記コードのように一つずつ変換しようと試みたのですが、String中のある文字がワイドバイトらしく、System.InvalidCastExceptionが表れてしまいます。 ("『"を上下反転したような文字) ワイドバイトのStringを1バイトずつ区切ってByte配列やLong配列へ格納する手法というものはありませんでしょうか。 よろしくお願いします。

  • int型の内容をbyteの配列にコピー

    int型の内容をbyteの配列にコピーする方法を教えて下さい。 int i_value = 500; byte[] by_value; by_value = new byte[4]; // どのような処理が必要ですか? by_value[0]には、0x1 by_value[1]には、0xf4 と格納したいです。 数字→文字列→文字(byte)できたのですが…。 C言語の場合、memcpy関数で型が異なってもキャストすれば回避できました。 JAVAでの方法を教えて下さい。

    • ベストアンサー
    • Java
  • byte配列の途中から2個ずつintに移すには?

    byte配列の途中から2個ずつintに移すには? Byte[] recvData={02:03:04:05:06:01:00:02:00:FF:FF:05} int nCount; =3;//データn個ください。 List<int> ValueList = new List<int>();//格納用 for (int i = 0; i < nCount; i++) {   //[0]~[4]までヘッダ+サブヘッダ。データは[5]から2byteずつ ValueList.Add(recvData[5 + i * 2] | (recvData[6 + i * 2] << 3)); }; という感じで、溜まったbyte配列の受信データから 0001、0002、65535とデータ部分を2byteずつ取り出したいのですが もうちょっとC#なら簡潔な書き方ってあるのでしょうか?

  • int配列をbyte配列に変換

    MIDPアプリを作成している初心者です。 Image データを一旦端末のレコードストアに保存しておく為、 getRGB()で取得したint配列を、byte配列に変換しなくてはいけません。 ↓のように レコードストアに書き込むメソッドを書いてみました。 public void writeRecordStore( String name, Image image ) {     int width = image.getWidth();     int height = image.getHeight();     int[] pxData = new int[ width*height ];     byte[] byteData;     RecordStore rs = null;     try {         //画像をバイトデータに変換         image.getRGB( pxData, 0, width, 0, 0, width, height );         //レコードストアを開く         rs = RecordStore.openRecordStore( name, true );         //バイト配列に変換 ← ここがわからない                  //レコードの追加         rs.addRecord( byteData, 0, byteData.length );              } catch( Exception e ) {     } } int配列をbyte配列に変換する方法わかる方 ご教授の程お願いします。 また、まだコーディングに自信が無いので、文法のミスもご指摘頂けたらありがたいです。

    • ベストアンサー
    • Java
  • テキストBOXから取得した文字コードの扱いについて

    JSPで記述したページのテキストBOXに入力されたSJIS形式の日本語文字データをサーブレットに送信してそれを取得して、文字のエンコードを行う際に気がついたのですが String text = request.getParameter("text"); byte[] bytes =text.getBytes("ISO8859_1"); text=new String(bytes, "SJIS"); のようにすればサーブレットで扱う時に正しく日本語表示できるのですが String text = request.getParameter("text"); byte[] bytes =text.getBytes("SJIS"); text=new String(bytes, "SJIS"); とすると正しく表示されません。 text.getBytes("SJIS");で取得格納されるbyteのデータに違いがあるようです。この場合取得されるbyteの配列は3つになっています。 ISO8859_1で取得するとbyte配列は2つになっています。このISO8859_1のbyte配列のデータと同じ中身のものを単にString(byteデータ,文字コード)のコンストラクタに入れるとSJISの文字コードで正しく変換出来ています。 要するにもともとSJISの文字データをgetByte("SJIS")で変換したものがなんで、もとに戻せないのかということです。また、違う文字コードのISO8859_1ではSJISに対応したbyteの配列になるのかということです。 ひどい乱文ですみませんが、よろしくお願いします。

  • vb.netでByte型の実配列サイズが大きい件

    vb.netでByte型の配列を100byteで宣言しましたが、実際の配列サイズは101byteになりました。 (例) Module Module1 Sub Main() Dim buffSize As Integer = 100 Dim inputBuff(buffSize) As Byte Dim ii As Integer = inputBuff.Length Console.WriteLine("バッファサイズ = {0}", ii) End Sub End Module ここで、iiは、101となります。 CとかC++では、有り得ない仕様ですが、どういう意味が有るのでしょうか? ご教示お願い致します。

  • byte[2] から int へ。

    それぞれintの下位2バイトのビット列保持するbyte型配列の要素2つを int 形の整数に治したいのですがいい方法が思いつきません。例えば、 byte[0] = 0x01; byte[1] = 0x01; ならば、 00000000 00000000 00000001 00000001 で、256 + 1 = 257 byte[0] = 0x02; byte[1] = 0x10; ならば、 00000000 00000000 00000010 0000011 で、512+3 = 515 です。byteの値が0~127の場合は int n = byte[0] << 8 n = n | byte[1] という感じでいけそうなのですが、byte[0]が 0xFF のような負の値のときにint とのビット演算(もしくはシフト演算)で上位2バイト分も補数表記のためか全部1で埋まってしまい、上の方法はだめみたいです。 byte[0] = 0x01; byte[1] = 0xFF; のときは、 00000000 00000000 00000001 11111111 で、256+255 = 511 としたいのですが、場合わけをせずに求める よい方法はないでしょうか。

    • ベストアンサー
    • Java
  • バイト配列

    以下のようにバイト配列を確保した場合 byte buffer1[] = new byte[2]; byte buffer2[] = new byte[2]; byte buffer3[] = new byte[4]; buffer1[0] = 1; buffer1[1] = 2; buffer2[0] = 3; buffer2[1] = 4; C言語でいうところのmemcpy(buffer3,buffer1,2);memcpy(buffer3 + 2,buffer2,2);のように buffer1とbuffer2を連結したbuffer3を作成したいのですが、どうするのが良いでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • 配列のことでなのですが

    配列で先頭から順番に文字列を格納していきたいのですがどのような方法があるでしょうか? ただforループなどで順番に繰り返すのではなくて、文字列を入力する度に配列の最後尾に文字列を格納していきたいのですが、 例えば for(i=0;i<=10;i++){ scanf("%s",hairetu[i]) } のような方法ではなく配列の中に文字列を前から順番に格納したいです。 詳しい方は知識をかしていただけるとありがたいです。

専門家に質問してみよう