缩略图和未缩放福彩12选5走势图之间的坐标不匹配

笑塞拉芬

新成员
已加入
2016年8月16日
留言内容
3
编程经验
1-3
你好,

我有一个未缩放的蓝图流到福彩12选5走势图控件(BackBuffer)(适合福彩12选5走势图)中。我将可见预览设置为“缩放”,该福彩12选5走势图显示为大缩略图(viewPort)。
我使用鼠标事件来捕获缩略图或预览福彩12选5走势图上的矩形。

我正在尝试缩放该捕获的矩形,以将后缓冲区的相应区域复制到另一个imagebox(zoom_Box)上。

预期的行为:我在缩略图(视口)上选择一个区域,然后抓取缩放后的区域以绘制(从backBUffer)到第二个预览(zoom_Box)上。
当前行为:从未缩放福彩12选5走势图(BackBuffer)显示或复制的区域是偏移的,偏移量随着缩略图中心的偏移量的增加而增加(与左侧成比例)。因此,如果我选择缩略图(视口)的中心,则会接近较大img的所选中心。如果选择(ViewPort)的右下角,则会得到福彩12选5走势图的大量偏移区域(从Backbuffer绘制到zoom_box中)。似乎它已按缩略图上初始选择的宽度(按比例缩放)偏移。

所做的努力:
在过去的两周里,我已经阅读了大约二十打的答案,下载并尝试使用几个示例项目。我尝试了几种计算矩形比例的方法。到目前为止,我已经尝试了几种图形方法。

例子:
1/5比例福彩12选5走势图预览中的(10,10,100,50)矩形 应该 在较大福彩12选5走势图上转换为(50,50,500,250)的矩形。尽管坐标似乎匹配,但是从较大福彩12选5走势图中拉出的实际区域会发生巨大偏移。所选区域离中心越远,绘制时福彩12选5走势图偏移得越“左”。因此,选择中间位置,我得到的偏移量大约是选择宽度的一半。如果选择右下角,则将获得后缓冲区域的区域,该区域位于中心左侧,而中间距离为四分之一...

我的代码是这样

C#:
//On loading of an image, I get the scale values. I've tried all 3 methods below
[I]              scaleToBufferX[/I] = (([COLOR=#ff0000][B]float[/B][/COLOR])[I]BackBuffer[/I].Image.Width / [I]ViewPort[/I].ClientSize.Width );
              [I]scaleToBufferY[/I] = (([COLOR=#ff0000][B]float[/B][/COLOR])([I]BackBuffer[/I].Image.Height) / [I]ViewPort[/I].ClientSize.Height );
              [I]//resizeFactor[/I] = [COLOR=#004085]Math[/COLOR].[COLOR=#191970][B]Max[/B][/COLOR]([I]scaleToBufferX[/I],[I]scaleToBufferY[/I]);
              //[I]ScaleOf_X[/I] = ([COLOR=#ff0000][B]int[/B][/COLOR])([I]BackBuffer[/I].Image.Width / [I]resizeFactor[/I]);
              //[I]ScaleOf_Y[/I] = ([COLOR=#ff0000][B]int[/B][/COLOR])([I]BackBuffer[/I].Image.Height / [I]resizeFactor[/I]);

//I scale the rectangle to determine the area I will paint from in the next step
              [COLOR=#004085][B]Rectangle[/B][/COLOR] zoomArea = [COLOR=#008b8b][B]new[/B][/COLOR] [COLOR=#004085][B]Rectangle[/B][/COLOR](
                    ([COLOR=#ff0000][B]int[/B][/COLOR])((([I]StartX[/I])*[I]scaleToBufferX[/I]))
                    ,([COLOR=#ff0000][B]int[/B][/COLOR])((([I]StartY[/I])*[I]scaleToBufferY[/I]))
                    ,([COLOR=#ff0000][B]int[/B][/COLOR])((([I]EndX[/I]*[I]scaleToBufferX[/I])-([I]StartX[/I])*[I]scaleToBufferX[/I]))
                    ,([COLOR=#ff0000][B]int[/B][/COLOR])((([I]EndY[/I]*[I]scaleToBufferY[/I])-([I]StartY[/I])*[I]scaleToBufferY[/I]))
                                                    
     //I call the func to return the region of the larger image                                             );
[COLOR=#0000ff][B]if[/B][/COLOR]([I]loadedImage[/I] != [B]null[/B])
               {
               [I]PreviewBuffer[/I].Image = [COLOR=#191970][B]ZoomImage[/B][/COLOR]([I]loadedImage[/I], zoomArea);
               [I]zoom_Box[/I].Image = [I]PreviewBuffer[/I].Image;
               [I]zoom_Box[/I].[COLOR=#191970][B]Refresh[/B][/COLOR]();
               }

     [COLOR=#0000ff][B]private[/B][/COLOR] [COLOR=#004085]Image[/COLOR] [COLOR=#191970][B]ZoomImage[/B][/COLOR]([COLOR=#004085]Image[/COLOR] input, [COLOR=#004085][B]Rectangle[/B][/COLOR] zoomArea)
        {
               
                   //I have tried these methods, plus cloning the bitmap. I have also tried passing the width and height of the zoomarea to new Bitmap(h,w)
               [COLOR=#004085]Bitmap[/COLOR] newBmp = [COLOR=#008b8b][B]new[/B][/COLOR] [COLOR=#004085]Bitmap[/COLOR]([COLOR=#00008b]1024[/COLOR],[COLOR=#00008b]1024[/COLOR]);
             [COLOR=#008000]//Bitmap newBmp = new Bitmap(zoom_Box.ClientSize.Width,zoom_Box.ClientSize.Width);               [/COLOR]
               [COLOR=#004085]Graphics[/COLOR] g = [COLOR=#004085]Graphics[/COLOR].[COLOR=#191970][B]FromImage[/B][/COLOR](newBmp);
               g.[COLOR=#191970][B]DrawImage[/B][/COLOR](input,[COLOR=#008b8b][B]new[/B][/COLOR] [COLOR=#004085][B]Rectangle[/B][/COLOR]([COLOR=#00008b]0[/COLOR],[COLOR=#00008b]0[/COLOR],[COLOR=#00008b]1024[/COLOR],[COLOR=#00008b]1024[/COLOR]),zoomArea,[COLOR=#004085][B]GraphicsUnit[/B][/COLOR].[I]Pixel[/I]);

               [I]OldFileNameLabel[/I].Text = zoomArea.X + [COLOR=#0000ff]" "[/COLOR] + zoomArea.Y+ [COLOR=#0000ff]" "[/COLOR] +zoomArea.Width+ [COLOR=#0000ff]" "[/COLOR] +zoomArea.Height;
              [COLOR=#008000]//g.CopyFromScreen(StartX,StartY,0,0, zoomArea.Size);[/COLOR]
            
            g.[COLOR=#191970][B]Dispose[/B][/COLOR]();
            [COLOR=#000080]return[/COLOR] newBmp;
        }

没有错误,只有C#新手感到困惑。

ps。

组成c#的两个单词不是Sea或See and Sharp?
 
Last edited:
最佳 底部