実現したいこと
現在自分はVB.NETにおいて、ペイントソフトを作っているのですが
CでDLLを作ってまでpictureboxAからpictureboxBへ高速な拡大縮小コピーもしくは、
picBackのバックバッファにMouseMoveイベントを起こして
picFrontに拡大表示したいのですが、
調べ方が甘いのか高速な拡大縮小コピーのやり方が
よくわからないです。なぜかというと、ネットで調べるとvb.netで拡縮処理をする際の情報にほとんど
必ず何故か既存の画像をpictureboxに開いて拡大縮小コピー処理しているからです。
つまり、自分のやりたい拡縮処理は既に描画メソッドを使って描画済みのpictureboxに
拡大縮小コピーしたいのですが自分の不得意なc++&WINAPIでDLLを作ってまでプログラム作成するか
考え中です。
もしもDLLを作ってしまわなくとも同様の拡縮処理が行えるやり方の方法が
知っていましたら教えてください。ちなみに相当な数のページをブックマークしましたが
StrectchBltやDrawImage、キャプチャー、保存、どれもうまくいきませんでした。
あと、Ctrl+F5を押すと何故かエラーになるのにF5を押すとプログラムが起動します。
これは何かの例外処理エラーなのか分かりません。
発生している問題・分からないこと
描画最中のpicBackからpicFrontへpictureAの内容を高速で拡大コピーしたいのに
全く表示されません。どうすれば高速な拡大縮小コピーが出来るか教えてください。
該当のソースコード
VB.NET
1Private Sub ButtonKake_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonKake.Click 2 Dim R As Integer 3 Dim G As Integer 4 Dim B As Integer 5 6 scaleX *= 2 7 Dim bmp As Bitmap = New Bitmap(PicBack.Width, PicBack.Height) 8 Dim bmpFront As Bitmap = New Bitmap(PicFront.Width, PicFront.Height) 9 Dim liner As New Pen(Color.FromArgb(PalColor(PalNum).R * 32, PalColor(PalNum).G * 32, PalColor(PalNum).B * 32), 1) 10 '描画先とするImageオブジェクトを作成する 11 Dim canvas As New Bitmap(PicFront.Width, PicFront.Height) 12 'ImageオブジェクトのGraphicsオブジェクトを作成する 13 Dim g2 As Graphics = Graphics.FromImage(canvas) 14 15 For Y = 0 To PicBack.Height 16 For X = 0 To PicBack.Width 17 R = bmp.GetPixel(X / scaleX, Y / scaleX).R 18 G = bmp.GetPixel(X / scaleX, Y / scaleX).G 19 B = bmp.GetPixel(X / scaleX, Y / scaleX).B 20 21 22 '(10, 20)-(100, 200)に、幅1の黒い線を引く 23 g2.DrawLine(liner, X, Y, X, Y) 24 25 Next 26 Next 27 'リソースを解放する 28 g2.Dispose() 29 'PictureBox1に表示する 30 PicFront.Image = canvas 31 32 End Sub 33 34続いてDLL作成中cコード 35#include<windows.h> 36#include "main.h" 37 38#pragma once 39#define DLLEXPORT extern "C" __declspec(dllexport) 40DLLEXPORT void Init8BitDIB(int Width,int Height,LPBYTE lpDIB,LPBYTE lpPixel,LPBITMAPINFO lpbiInfo, 41 LPRGBQUAD lpRGB); 42DLLEXPORT void SetPallet(int Index,int R,int G,int B,LPRGBQUAD lpRGB); 43DLLEXPORT void PSET(int x,int y,int Width,int Index,LPBYTE lpPixel); 44 45↑main.h 46 47↓main.cpp 48DLLEXPORT void Init8BitDIB(int Width,int Height,LPBYTE lpDIB,LPBYTE lpPixel,LPBITMAPINFO lpbiInfo, 49 LPRGBQUAD lpRGB) { 50 int i; 51 52 /* DIB用バッファ確保 */ 53 lpDIB = (LPBYTE)HeapAlloc(GetProcessHeap(), 54 HEAP_ZERO_MEMORY, sizeof(BITMAPINFO) + 55 255 * sizeof(RGBQUAD) + 128 * 256); 56 57 /* ポインタ設定 */ 58 lpbiInfo = (LPBITMAPINFO)lpDIB; 59 lpPixel = lpDIB + sizeof(BITMAPINFO) + 255 * sizeof(RGBQUAD); 60 lpRGB = (LPRGBQUAD)(lpbiInfo->bmiColors); 61 62 /* 適当なカラーテーブルを設定 */ 63 for (i = 0;i < 256;i++) { 64 65 lpRGB[i].rgbRed = i; 66 lpRGB[i].rgbGreen = 255 - i; 67 lpRGB[i].rgbBlue = 128 - i / 2; 68 69 } 70 71 /* BITMAPINFO設定 */ 72 lpbiInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 73 lpbiInfo->bmiHeader.biWidth = 128; 74 lpbiInfo->bmiHeader.biHeight = 256; 75 lpbiInfo->bmiHeader.biPlanes = 1; 76 lpbiInfo->bmiHeader.biBitCount = 8; 77 lpbiInfo->bmiHeader.biCompression = BI_RGB; 78 79 /* 適当なピクセル列を設定 */ 80 for (i = 0;i < 256;i++) { 81 FillMemory(lpPixel + i * 128, 128, i); 82 } 83 84 return; 85 86} 87 88 89DLLEXPORT void SetPallet(int Index,int R,int G,int B,LPRGBQUAD lpRGB) 90{ 91 if(Index<1 || Index>255) return; 92 93 lpRGB[Index].rgbRed=R; 94 lpRGB[Index].rgbGreen=G; 95 lpRGB[Index].rgbBlue=B; 96 97 return; 98} 99 100DLLEXPORT void PSET(int x,int y,int Width,int Index,LPBYTE lpPixel) 101{ 102 lpPixel[x+y*Width]=Index; 103 return; 104}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
VBNETの自作なんちゃってパレットは動きますが、
picbackにマウスカーソルを動かしても全く変化が無い
ばかりかpicbackに表示されているかどうかは未確認ですがpicFrontには表示されないです。
ただし、picFrontを取り除くとpicbackには等倍で表示されます。
補足
開発環境Windows11 home SDD256GB Memory 16GB CPU:AMD
VisualBasic.NET 2008 Expressです。
(もし仮に作る必要ならば)DLL作成はVisualC++6.0です。

回答1件
あなたの回答
tips
プレビュー